循环队列基本操作及遍历 C语言实现(数组)
循环队列基本操作及遍历 C语言实现(数组)
与栈不同 队列基本原则:
先入先出 后入后出
约定一个下标(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=(s->rear+1)%MAX;
return 1;
}
}
出队操作
int dequene(squene *s,int x)
{
if(s->rear==s->front)
{
puts("表空");
return 0;
}
else
{
x=s->elem[s->front];
s->front=(s->front+1)%MAX;
printf("出对元素:%d\n",x);
return 1;
}
}
想象多次入队和出队 front始终追赶rear 二者一致沿顺时针方向运动 数据也就在他们之间 (front–rear 顺时针) 故可以使用此循环来遍历数据 此函数返回值为数据元素个数
int linear(squene *s)
{
int j=0;//计数器
for(int i=s->front;i!=s->rear;i=(i+1)%MAX)
{
printf("%d->",s->elem[i]);
}
return j;
}
总: 一个简单的程序
注意:最多储存元素个数为MAX-1
#include
#include
#define MAX 5
typedef struct {
int elem[MAX];
int front;
int rear;
}squene;
squene * initsquene()
{
squene *s=(squene *)malloc(sizeof(squene));
s->front=0;
s->rear=0;
return s;
}
int enquene(squene *s,int e)
{
if((s->rear+1)%MAX==s->front)
{
puts("表满");
return 0;
}
else
{
s->elem[s->rear]=e;
s->rear=(s->rear+1)%MAX;
return 1;
}
}
int dequene(squene *s,int x)
{
if(s->rear==s->front)
{
puts("表空");
return 0;
}
else
{
x=s->elem[s->front];
s->front=(s->front+1)%MAX;
printf("出对元素:%d\n",x);
}
}
int linear(squene *s)
{
int j=0;
for(int i=s->front;i!=s->rear;i=(i+1)%MAX)
{
printf("%d->",s->elem[i]);
j++;
}
puts("");
return j;
}
int main()
{
squene *s=initsquene();
int x,key,temp;
//puts("操作:1->入队 2->出队 3->遍历显示");
while(1)
{
puts("操作:1->入队 2->出队 3->遍历显示");
scanf("%d",&key);
switch(key)
{
case 1: puts("不同数据(数字)间回车键隔开 输入0退出");
scanf("%d",&x);
while(x)
{
enquene(s,x);
scanf("%d",&x);
}
break;
case 2: puts("");
dequene(s,temp);
break;
case 3: puts("");
temp=linear(s);
printf("表长>:%d\n",temp);
break;
}
}
//linear(s);
}
循环队列基本操作及遍历 C语言实现(数组)相关教程