關於循環隊列順序表示和實現

隊列的性質

隊列滿足的基本性質爲先進先出,後進後出。

eg:生活中類似於排隊打飯一樣,先排隊的先打飯。

一,關於順序棧的結構體表示

結構體定義

    struct Node
{
    int data[MaxSize];             //存放隊列的數組
    int front;                            //隊尾
    int rear;                             //隊頭
};

圖解:

如上圖可以得出:

  • 判斷隊列滿的方法就是隊尾加1除以隊長跟隊頭位置是否相等。即(S->rear+1)%Size==S->front
  • 判斷隊列爲空的方法就是隊頭跟隊尾位置是否相等。即S->front==S->rear
  • 這裏可以當作,隊列滿是看隊頭是否能追上隊尾
  • 隊列空,是看隊尾是否能追上隊頭
  • 此處將n-1就定義爲滿隊列的原因是,若全部都存入數據,則S->front與S->rear相等,與空棧情況一樣。

循環隊列的定義

Node *Init()
{
	Node *S = new Node;
	S->front = S->rear = 0;
	return S;
}

即簡單初始化隊頭隊尾,都指向隊列底就行,也就是賦值爲0.


入隊

void Enter(Node &S)
{
	if ((S.rear + 1) % MaxSize != S.front)    //判斷是否爲滿隊列
	{
		cout << "輸入要進入隊列的值:";
		cin >> *(S.data + S.rear);
		S.rear = (S.rear + 1) % MaxSize;
	}
	else
	{
		cout << "隊列已滿" << endl;
	}
}

先判斷是否爲滿隊列,若隊列已滿,則不能繼續存數據


出隊列

void Delete(Node &S)
{
	if (S.front != S.rear)                  //隊列不爲空
	{
		S.front = (S.front + 1) % MaxSize;
	}
	else
	{
		cout << "隊列爲空" << endl;
	}
}

隊列的性質是先進先出,所以先判斷隊列是否爲空,若不爲空,則先出先進的,即存放在隊尾的數據


顯示先入隊列的數據

void Show(Node *S)
{
	cout << "隊頭元素爲:";
	cout << *(S->data + S->front) << endl;
}

代碼:

#include<iostream>
using namespace std;

#define MaxSize 20

struct Node
{
	int data[MaxSize];
	int front;
	int rear;
};

Node *Init()
{
	Node *S = new Node;
	S->front = S->rear = 0;
	return S;
}

void Enter(Node &S)
{
	if ((S.rear + 1) % MaxSize != S.front)
	{
		cout << "輸入要進入隊列的值:";
		cin >> *(S.data + S.rear);
		S.rear = (S.rear + 1) % MaxSize;
	}
	else
	{
		cout << "隊列已滿" << endl;
	}
}

void Delete(Node &S)
{
	if (S.front != S.rear)                  //隊列不爲空
	{
		S.front = (S.front + 1) % MaxSize;
	}
	else
	{
		cout << "隊列爲空" << endl;
	}
}

void Show(Node *S)
{
	cout << "隊頭元素爲:";
	cout << *(S->data + S->front) << endl;
}


int main()
{
	Node *S = Init();
	Enter(*S);
	Enter(*S);
	Enter(*S);
	Show(S);
	Delete(*S);
	Show(S);
	system("pause");
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章