線状構造キューの2つの一般的な用途の一つ

線状構造キューの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;
}

おすすめ

転載: www.cnblogs.com/yuuuuu422/p/12623679.html