❶ 數據結構與演算法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);
}