对列:只是允许在一端进行插入,另一端删除的线性表(是有空队列存在的)
(先进先出(FIFO)
队列的顺序实现:
(一下代码都是基于rear指向队尾元素的后一个元素,也就是说是要插下一个应该插入的位置)
#define Maxsize 10
typedef struct{
ElemType data[ Maxsize ];
int front,rear;
} ;
void init(Sequeue &Q){//初始化时队头和队尾指针指向0
Q.rear=Q.front=0;
}
void test(){
Sequeue Q;//声明一个队列(顺序存储)
init(Q);
............//后续操作
}
bool queueempty(Sequeue &Q)//判断队列是否为空
{
if(Q.rear==Q.front)
return true;
else
return false;
}
//下面的语句很重要。假如说,循环队列里的rear已经到到了,并且队列的另一端已经有数据出去了,怎么办呢,
bool enqueue(Sequeue &Q,EleType x){//循环队列入队
//判断队列是否为满
if((Q.rear+1)%MaxSize==Q.front)return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;//这个语句可以用代入数自己算一下
}
//出队(删除一个对头元素,并用x返回)
bool DeQueue(Sequeue &Q,EleType &x)
{
if(Q.rear==Q.front) return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%Maxsize;
return true;
但是以上的这这种方式,容易造成有一块空间的浪费;有的时候老师不让你浪费怎么办?
可以在最开始设置一个变量(x),用来收集当前队列中元素的个数,当入队时x++,出队时x--;到最后看看这个x与最大量是否相当。