C语言如何在队列中删除一个数组,循环队列基本操作及遍历 C语言实现(数组)...

循环队列基本操作及遍历 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

故引入循环队列 如图

8ee1c9a8d3ef3b00630b8b516beefb10.png当然这只是逻辑上的 内存条还是直的 掰不弯(

此时 再出现上述情况 (即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语言实现(数组)相关教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值