❶ 数据结构与算法06——队列之循环队列
与栈不同,他就是现实中排队一样,讲究先来后到,即 先进先出 。
打个比方,你告诉朋友我们做地铁去西湖,你输入 " s-u-b ", 如果按照栈 先入后出后入先出 的方式,朋友会收到 b-u-s , what?有地铁,我们干嘛做两个小时的汽车??? 队列就可以让朋友按你输入的顺序依次收到 s-u-b 。
简单的看一下队列,是线性结构,想到什么?非常熟悉的 线性表 ,有两种存储结构, 顺序存储和链式存储 。
我们今天先讲一讲队列的顺序存储结构—— 循环队列
但是,,,如果如下图,出队到只剩最后一个元素,front和rear又都指向了一个同元素,而且仅在队尾,又要认为队列为空?不可能啊,明明最后一块存储单元还有一个元素,而且却不能继续入队新元素,超出了存储范围,如果要继续利用前面出队的空余空间,又该怎么用?
如果 我们把队列设计成下面这样:
哈哈,循环了。队尾rear指向下一个位置,而不是当前的队尾元素。
这就是循环队列的工作流程
将上面的过程做一下整理:
指定队列最大存储5个单元,方便观看
❷ 在循环队列中入队、出队操作的过程
入队:
1、新建一个变量p,指定内存空间;
2、将变量p的next指针指向队头head;
3、将队尾变量的next指针指向变量p;
4、将变量p变为队尾(或队头);
5、具体如下:
new(p);
p^.data:=****(自选数据)
p^.next:=head;
tail^.next:=p;
tail:=tail^.next;(或head:=p;)
出队:单项循环队列中需要搜索出队变量的前缀(或后缀),双向循环队列不需,设该出队变量为x;前缀为p,后缀o为q;
1、将前缀的next(或right)指针指向后缀;
2、(单项循环队列不要此项)将后缀的last(或left)指针指向前缀;
3、若从队头或队尾出队则要调整队头变量head或队尾变量tail;
4、释放出队的变量;
5、具体如下:
p^.next:=q;
q^.last:=p;
head:=q;(或tail:=p;)
dispose(x);
❸ 循环队列-实现
姓名:张钰 学号:21011210154 学卖厅院:通信工程学院
【嵌牛导读】循环队列是对前文提出的简单队列的改进,能减少对存储空间的浪费。
【嵌牛鼻子】循环队列
【嵌牛提问】循环队列如何实现
【嵌牛正文】
循环队列也是一种线性数据结构,其操作表现基于先进先出原则,并且队尾被连接在队首之后以形成一个循环。循环队列的一个好处是可以利用这个队列之前用过的空间。在上文提出的队列中,只要队列满仿李了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用中大隐这些空间去存储新的值,减少对存储空间的浪费。
我们可以使用固定大小的数组和两个指针来指示起始位置和结束位置,来实现循环队列,基本思路如下:
1、队列为空状态时,两个指针 head = tail = -1
2、入队操作:如果入队前是空的,则将head 和 tail 都向右移一位,使得下标变为为0;否则只需右移tail
3、出队操作:如果出队时队列不为空,且只剩最后一个元素,即head == tail,则令head = tail = -1;否则只需右移head
4、队列首元素:只要队不为空,head指向队首元素
5、队列尾元素:只要队不为空,tail指向队尾元素
6、判定队列为空:指针 head = tail = -1,此时为空
7、判定队列为满:tail右移发现与head重合,则没有地方放入新的元素,此时为满
python实现:
❹ 在循环队列中怎样实现入队和出队操作 数据结构 C语言
入队操作
功能:将元素 x 插入到Q的队尾。
算法:Status EnQueue(SqQueue &Q, QElemType e) {
if ((Q.rear+1) % MaxQsize == Q.front) return ERROR; // 队列满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1) % MaxQsize;
return OK;
}
出队操作
功能:删除Q的队头元素,并返回其值。
算法: Status DeQueue(SqQueue &Q, QElemType &e) {
if (Q.front == Q. rear) return ERROR; // 队列空
e = Q.base[Q.front];
Q.front=(Q.front+1) % MaxQsize;
return OK;
}
❺ 循环队列 数据结构题 【求一完整程序 !】编写实现该循环队列的入队和出队操作的算法。
(VC6下编译通过)
#include <stdio.h>
main()
{
int a[1000],top,tail;
int i,n=1;
do
{
switch (n)
{
case 1:top=tail=0;break;
case 2:printf("输入要插入的元素:");scanf("%d",&a[++top]);break;
case 3:if (tail<top) tail++;break;
case 4:printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n队头为: %d\n",a[top]);break;
case 5:printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");if (tail==top) printf("空队列\n"); else printf("非空队列.\n");
}
if (n!=5&&n!=4)
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("队列现在状态:");
for (i=tail+1;i<=top;i++)
printf(" %d",a[i]);
if (tail==top)
printf("空队列");
printf("\n");
printf("\n1队列初始化\n2入队操作\n3出队操作\n4输出队头元素\n5判断队列是否为空\n0退出\n请输入代码:");
scanf("%d",&n);
} while (n!=0);
}