队列:是一种操作受限的线性表(特殊线性表),只允许在队头进行删除操作,在队尾进行插入操作。操作特性是先进先出。(类似于生活中的排队买饭)
队头、队尾、空队列(不含有任何元素的空表)。
栈和队列都是操作受限的线性表,不是任何对线性表的操作都可以作为栈和队列的操作。(不可随便读取栈或队列中间的某个数据)。
1.队列的顺序存储
是指分配一块连续的存储单元存放队列中的元素,并附设两个指针;队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置(不同教材,定义不一样)
初始状态(队空的条件):Q.front==Q.rare==0;
进队操作:队不满时,先送值到队尾元素,再将队尾指针加一。
出队操作:队不为空时,先取队头元素,再将队头指针加一。
注意:不能用Q.rare==MaxSize代表队满(因为假溢出时队并不满,此时满足前述条件)
2.循环队列
为了解决假溢出引入了循环队列,将顺序队列臆造为一个环状的空间,把存储队列元素的表从逻辑上视为一个环。
当队首指针Q.front=MaxSize-1时,再前进一个位置就自动到0。
初始值:Q.front=Q.rear=0
队首指针进1:Q.front=(Q.front+1)%MaxSize;
队尾指针进1:Q.rear=(Q.rear+1)%MaxSize;
一般为了区分队空和队满需要浪费一个队列单元来区分,(即一般队尾指针和队头指针相隔一个空白单元)。
此时就有Q.front==Q.rear时队为空,当[Q.rear+1]%MaxSize==Q.front时为满。
队列中的元素个数就有(Q.rear+MaxSize-Q.front)%MaxSize;
注意:对于区分队空队满条件时还可以设置一个中间变量来判断;例如设置一个整形
1.int x来记录插入元素的个数,每次插入一个元素X自加一,删除自减一所以此时
队满:Q.rear==Q.front&&x==Maxsize;
队空:Q.rear==Q.front&&x==0;
2.或者增设一个变量tag,int tag;使得每次插入成功令tag=1;每次删除成功令tag=0;此时
队满:Q.rear==Q.front&&tag==1;
队空:Q.rear==front&&tag==0;
入队操作
1.对于rear指向队尾元素下一个位置
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;
2.对于rear指向队尾元素
Q.rear=(Q.rear+1)%MaxSize;
Q.data[Q.rear]=x;
此时判空条件为
(Q.rear+1)%MaxSize=Q.front
出队操作
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;