隊列的性質
隊列滿足的基本性質爲先進先出,後進後出。
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");
}