与栈不同 队列基本原则:
先入先出 后入后出
约定一个下标(rear)指向当前入队元素要插入的下标 即最后一个入队元素下标的下一位
即 如果要加入新的元素x 执行elem[s->rear]=x
一个下标(front)指向最先出队的元素
typedef struct {
int elem[MAX];
int front;
int rear;
}squene;
初始化 把front 和rear的值置为 0
squene * initsquene()
{
squene *s=(squene *)malloc(sizeof(squene));
s->front=0;
s->rear=0;
return s;
}
考虑一个MAXSIZE 为5的情况 如果进行5次 入队操作 5次出队操作 那么front和rear 都指向内存中最后一个空间 无法再加入元素 但此时队长为0
故引入循环队列 如图
当然这只是逻辑上的 内存条还是直的 掰不弯(
此时 再出现上述情况 (即s->rear=s->front=4)把 s->rear的值置为(s->rear+1)%MAX (此时为0)可以继续进行入队操作
出队时对front的操作与此类似
但此时 无法区分空表 与满表
故放弃一个数据空间 (front的后一位 ) (顺时针为前,逆时针为后)
则判断满表的条件为 (s->rear+1)%MAX==s->front
此时即使elem[s->rear]可用来存放元素 也不使用
入队操作
int enquene(squene *s,int e)
{
if((s->rear+1)%MAX==s->front)
{
puts("表满");
return 0;
}
else
{
s->elem[s->rear]=e;
s->rear