循环队列节约了一定的空间,仍然用数组实现。
要注意的是
- rear是队尾元素下一个单元的下标
- front == rear时队列为空
- 人为地让一个存储单元不存储任何信息,判满条件为 (rear+1+MAXSIZE)%MAXSIZE == front
- 之所以能成环全靠取余,看下面代码好好理解
实现代码如下:
#include<stdio.h>
#define MAXSIZE 6
#define ElemType int
typedef struct{
ElemType data[MAXSIZE];
int front, rear;
}SqQueue;
void init(SqQueue &Q);
bool Push(SqQueue &Q, ElemType x);
bool Pop(SqQueue &Q, ElemType & x);
void Traverse(SqQueue Q);
int main(void)
{
int x;
SqQueue Q;
init(Q);
Push(Q, 1);
Push(Q, 2);
Push(Q, 3);
Push(Q, 4);
Push(Q, 5);
Push(Q, 6);
Traverse(Q);
if(Pop(Q,x))
{
printf("Pop succeed!\n");
printf("The data popped out is %d\n",x);
}
Pop(Q,x);
Pop(Q,x);
Pop(Q,x);
Pop(Q,x);
if(Pop(Q,x))
{
printf("Pop succeed!\n");
printf("The data popped out is %d\n",x);
}
else
printf("Pop failed!\n");
return 0;
}
void init(SqQueue &Q)
{
Q.front = 0;
Q.rear = 0;
}
bool Push(SqQueue &Q, ElemType x)
{
if((Q.rear + 1 + MAXSIZE) % MAXSIZE == Q.front)
return false;
Q.data[(Q.rear++ ) % MAXSIZE] = x;
return true;
}//每一次push完,rear都在最后一个存储数据位置的后一位
bool Pop(SqQueue &Q, ElemType & x)
{
if(Q.front == Q.rear)
return false;
x = Q.data[(Q.front++ ) % MAXSIZE];
return true;
}
void Traverse(SqQueue Q) //从队首开始向后遍历
{
int p = Q.front;
while(p != Q.rear)
printf("%d\t",Q.data[p++]);
printf("\n");
}