队列作为基本的数据结构,是每个coder所必须掌握的。
队列在逻辑上就像是一条打饭的长队,排在前面的先打到饭(先进先出)。
这里用一个数组用以构造一个队列,并设置两个指向,head指向队首,tail指向队尾,初始状态是head与tail指向同一位置(队列为空)
队列有两个操作:入队与出队。
1.入队:对比打饭排队的场景,新来的人排在后面,这是队尾tail需向后移一位。
2.出队:已经打好饭的人就可以出去了,这时队头也需向后移一位,让后面的人成为队头。
注意:
当head与tail都移到数组末端,又该如何?
数组虽然在逻辑上已经为空,但是已经没有办法再入队了!
所以我们需要拿出地圆思想,把该数组看做一个没有首尾限制的空间,即数组最后一位的下一位就是第一位(如何让head与tail从数组尾部变为首部?取余操作即可)。
那么队列如果满了该如何判别:tail后一位指向若是head,那么就为满(因为head之后,tail之前的空间此时都已被占用,这两段空间是相连的)
代码如下:
#include<iostream> using namespace std; //队列数组 /*队列数组优化方案: 为保证数组空间被充分利用,可不遵守数组的首末位置为队列的首末位置 而是设置首末端指向:head,tail;将数组看做一个首末相连的空间 head指向的便是队列头部,tail指向尾部 若head与tail指向同一位置,那么说明队列为空 若head在tail前一个位置,说明队列已满 */ int a[10]; int head = 0; int tail = 0; void insert(int value){ int temp = (tail+1)%10; if(temp==head){ throw "queue full error"; } a[tail]=value; tail=temp; } int dequeue(){ if(tail == head){ throw "queue empty error"; } int value = a[head]; head = (head+1)%10; return value; } int main(){ while(1){ cout<<"这里是一个队列结构,1.入队,2.出队"<<endl<<"请输入:"; int select; cin>>select; if(select==1){ cout<<"请输入入队值:"; int value; cin>>value; insert(value); } else{ cout<<"队首为:"<<dequeue()<<endl; } } return 0; }