队列的性质
队列满足的基本性质为先进先出,后进后出。
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;}
代码:
#includeusing namespace std;#define MaxSize 20struct 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");}