線状構造キューの2つの一般的な用途の一つ
-
定義:
- 「FIFO」は、メモリ構造を得る達成する方法。
-
カテゴリー:
-
チェーンキュー:実装されたリンクリスト
-
静的キュー(円形キュー):アレイが実装
-
-
焦点の循環リスト
助けるために私たちが描かれたシンプルなキューに置く(ここで、「0」を意味無い要素を!!)(Typoraは、テーブルをしない、テーブルにのみ再生することができます。)
4 | 0 |
3 | 0 | < -リア
2 | 2 |
1 | 3 |
0 | 8 | < -フロント
1.なぜ静的キューキュー円形でなければなりません
- 素子、後方素子挿入位置を追加する場合、フロントが移動しない、後部上方に移動され、要素を削除するとき、移動が上方前部、移動しない後、これは運動のいくつかのラウンド後なり、前部及び後部で上方に移動させます循環キューとしていない場合は、次の領域は、メモリの無駄が生じ、使用することは決してありません。
2.循環キューいくつかのパラメータは、必要性を決定するために、そしてそれが何を意味するのか?
- パラメータ2:フロント(ヘッド素子に点)と背面(の末尾要素を指す後部要素)。
円形キューが空であるかどうかを確認する方法3。
- 値は後部の前部に等しい場合、キューが空の一部であります
円形キューが満杯であるかどうかを確認する方法4。
4 | 0 | < -リア
3 | 9 |
2 | 8 |
1 | 5 |
0 | 3 | < -フロント
- アレイ5の長さは、要素、リア=(1 +リア)%5と結合すれば、この時間は前後に等しいです。
- 論理的に、アレイはそれに満ちている場合でも、それが正面ではなく、後部は等しいですか?しかし、ノー!配列が空であるため、この状態です!!
- そう長く1 +リア==前、私たちのように、配列が一杯であると考えられている、上に示したように、最後のキュー位置は、挿入することはできませんされた最大の配列の要素マイナス1を(ひとつは影響しません)、できるようにする方法を取る、我々はそう配列がいっぱいであると見なされます。
- LENキュー即ち、配列要素がlen-1の場合は、キューが一杯であると考えられます。
//2020.4.3//16.18
#include<iostream>
using namespace std;
typedef struct Queue
{
int* pBase; //循环队列形式类似数组,设定数组首地址
int front; //队头
int rear; //队尾
int len; //队伍长度
}QUEUE, * PQUEUE;
//初始化队列
void init_queue(PQUEUE, int);
//判断队列是否已满
bool is_full(PQUEUE);
//插入元素
void entry_queue(PQUEUE, int);
//判断队列是否为空
bool is_empty_(PQUEUE); //用is_empty疯狂报错 搞了半天原来vs自带这个函数..只能改名了。。还不会
//删除元素
void out_queue(PQUEUE);
//遍历队列
void traverse_queue(PQUEUE);
int main()
{
int val;
int length = 5;
QUEUE Q;
PQUEUE pQ = &Q;
init_queue(pQ, length);
entry_queue(pQ, 1);
entry_queue(pQ, 0);
entry_queue(pQ, 4);
entry_queue(pQ, 2);
entry_queue(pQ, 8); //虽然队列长度是5,但最大元素只能是4
entry_queue(pQ, 5);
traverse_queue(pQ);
out_queue(pQ);
return 0;
}
void init_queue(PQUEUE pQ, int length)
{
pQ->len = length;
pQ->pBase = (int*)malloc(sizeof(int) * pQ->len);
pQ->front = 0;
pQ->rear = 0; //现在没有元素,数组第一个下标为0
return;
}
bool is_full(PQUEUE pQ)
{
if ((pQ->rear + 1) % pQ->len == pQ->front)
return true;
else
return false;
}
void entry_queue(PQUEUE pQ, int val)
{
if (is_full(pQ))
cout << "队列已满,元素" << val << "插入失败" << endl;
else
{
pQ->pBase[pQ->rear] = val;
pQ->rear = (pQ->rear + 1) % pQ->len;
}
return;
}
bool is_empty_(PQUEUE pQ)
{
if (pQ->front == pQ->rear)
return true;
else
return false;
}
void out_queue(PQUEUE pQ)
{
if (is_empty_(pQ))
cout << "队列为空,无法删除元素" << endl;
else
{
cout << "出队元素为" << pQ->pBase[pQ->front] << endl;
pQ->front = (pQ->front + 1) % pQ->len;
}
return;
}
void traverse_queue(PQUEUE pQ)
{
if (is_empty_(pQ))
cout << "队列为空";
int i = pQ->front;
while (i != pQ->rear)
{
cout << pQ->pBase[i] << " ";
i = (i + 1) % pQ->len;
}
return;
}