循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...
隊(duì)列 的定義:
一種可以是實(shí)現(xiàn)“先進(jìn)先出”的存儲(chǔ)結(jié)構(gòu)。數(shù)據(jù)的進(jìn)出類似于排隊(duì)購票。隊(duì)只允許隊(duì)尾一端(rear)添加,在另一端隊(duì)頭(front)刪除。隊(duì)有隊(duì)頭(front)和隊(duì)尾(rear)兩個(gè)指針。隊(duì)頭front指向第一個(gè)元素,隊(duì)尾rear指向無實(shí)際意義的元素,即隊(duì)列最后一個(gè)元素的下一位置。
//隊(duì)列定義
typedef struct Queue
{
int *pBase;//數(shù)組基地址,數(shù)組的首地址
int front;//隊(duì)頭
int rear;//隊(duì)尾巴
}QUEUE;
//創(chuàng)建一個(gè)隊(duì)列,空間分配,保存6個(gè)整形元素。
void init (QUEUE *pQ)
{
pQ->pBase=(int*)malloc(sizeof(int)*6);//長度為6的數(shù)組
pQ->front=0;
pQ->rear=0;
}
隊(duì)列的分類:
分為動(dòng)態(tài)隊(duì)列和靜態(tài)隊(duì)列兩種。動(dòng)態(tài)隊(duì)列用鏈表實(shí)現(xiàn)。動(dòng)態(tài)隊(duì)列易于實(shí)現(xiàn)。靜態(tài)隊(duì)列用數(shù)組實(shí)現(xiàn),靜態(tài)隊(duì)列通常都必須是循環(huán)隊(duì)列。
靜態(tài)隊(duì)列為甚么必須是循環(huán)隊(duì)列?
數(shù)組實(shí)現(xiàn)靜態(tài)隊(duì)列,刪除元素時(shí)候,每刪除一位,front指針上移一位,浪費(fèi)一個(gè)單位的數(shù)組空間。這種方式添加元素的時(shí)候rear上移一個(gè),刪除元素的時(shí)候front上移一個(gè)。總之都是上移。
當(dāng)front或者rear指到最上面一個(gè)位置,再上移就移動(dòng)到最下面一個(gè)位置。所以數(shù)組實(shí)現(xiàn)隊(duì)列的時(shí)候必須是循環(huán)隊(duì)列,傳統(tǒng)方式實(shí)現(xiàn)不了。
2.循環(huán)隊(duì)列需要幾個(gè)參數(shù)來確定,及循環(huán)隊(duì)列各個(gè)參數(shù)的含義
隊(duì)列需要兩個(gè)參數(shù)確定,front和rear.2個(gè)參數(shù)不同的場合有不同的含義,建議初學(xué)者先記住,然后慢慢體會(huì)。
隊(duì)列初始化
Front和rear的值都是零
隊(duì)列非空
Front 代表的是隊(duì)列的第一個(gè)元素
Rear代表隊(duì)列的最后一個(gè)有效元素的下一個(gè)元素
隊(duì)列空
Front 和rear的值相等,但不一定是零。
2.循環(huán)隊(duì)列入隊(duì)偽算法講解
Rear=(rear+1)%數(shù)組的長度
//進(jìn)隊(duì),隊(duì)尾rear+1;
bool en_queue(QUEUE *pQ,int val)
{
if(full_queue(pQ))
{
return false;
}
else
{
pQ->pBase[pQ->rear]=val;
pQ->rear=(pQ->rear+1)%6;
}
}
循環(huán)隊(duì)列出隊(duì)偽算法講解
Front=(front+1)%數(shù)組的長度
//出隊(duì),隊(duì)頭位置變?yōu)?#xff1a;(front+1)%6
bool out_queue(QUEUE *pQ,int *pVal)
{
if(emput_queue(pQ))
return false;
else
{ ??*pVal=pQ->pBase[pQ->front];
pQ->front=pQ->front+1;
return true;
}
}
4.判斷循環(huán)隊(duì)列是否已空
Front與rear的值相等,則該隊(duì)列為空。
5.如何判斷循環(huán)對(duì)了是否已滿
預(yù)備知識(shí) :由于是循環(huán)隊(duì)列,front的值可能比rear大,可能比rear小,也能相等,兩者沒有規(guī)律。但是隊(duì)首旋轉(zhuǎn)的速度不能比隊(duì)尾快。
當(dāng)存放元素的數(shù)目等于數(shù)組的存儲(chǔ)位置個(gè)數(shù),則rear和front重合。分不清頭和尾。
所以我們少用一個(gè)存儲(chǔ)位置。
c語言偽算法表示是:
隊(duì)列滿的條件:if ((rear+1)%數(shù)組長度==front)已滿
Else 不滿
#include
#include
#include"stdbool.h"//解決不能使用bool
#include "malloc.h"
//隊(duì)定義
typedef struct Queue
{
int *pBase;//數(shù)組基地址,數(shù)組的首地址
int front;//隊(duì)頭
int rear;//隊(duì)尾巴
}QUEUE;
void init(QUEUE*);//創(chuàng)建循環(huán)隊(duì)列
bool en_queue(QUEUE*,int ); //入隊(duì)
void traverse_queue(QUEUE*);//遍歷
bool emput_queue(QUEUE* );//隊(duì)是否滿
bool full_queue(QUEUE *);//對(duì)列是否空
bool out_queue(QUEUE *,int *);//出隊(duì)
int main()
{
int Val;
QUEUE Q;
init(&Q);
en_queue(&Q,1);
en_queue(&Q,2);
en_queue(&Q,3);
en_queue(&Q,4);
en_queue(&Q,5);
traverse_queue(&Q );//遍歷
if(out_queue(&Q ,&Val))
{
printf("出隊(duì)成功,出隊(duì)的元素是%dn",Val);
traverse_queue(&Q );//遍歷
}
return 0;
}
//創(chuàng)建一個(gè)隊(duì)列,空間分配,保存6個(gè)整形元素。
void init (QUEUE *pQ)
{
pQ->pBase=(int*)malloc(sizeof(int)*6);//長度為6的數(shù)組
pQ->front=0;
pQ->rear=0;
}
//判斷循環(huán)隊(duì)列是否滿
bool full_queue(QUEUE *pQ)
{
if((pQ->rear+1)%6==pQ->front)
{
return true;
}
else
return false;
}
//進(jìn)隊(duì),隊(duì)尾rear+1;
bool en_queue(QUEUE *pQ,int val)
{
if(full_queue(pQ))
{
return false;
}
else
{
pQ->pBase[pQ->rear]=val;
pQ->rear=(pQ->rear+1)%6;
}
}
//利用中間變量,遍歷隊(duì)列
void traverse_queue(QUEUE *pQ)
{
printf("隊(duì)列遍歷結(jié)果如下n");
int i= pQ->front;
while(i!=pQ->rear)
{
printf("%d ",pQ->pBase[i]);
i=(i+1)%6;
}
printf("n");
return ;
}
bool emput_queue(QUEUE* pQ)
{
if(pQ->front==pQ->rear)
return true;
else
return false;
}
//出隊(duì),隊(duì)頭front+1
bool out_queue(QUEUE *pQ,int *pVal)
{
if(emput_queue(pQ))
return false;
else
{ ??*pVal=pQ->pBase[pQ->front];
pQ->front=(pQ->front+1)%6;
return true;
}
}
總結(jié)
以上是生活随笔為你收集整理的循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: krpano 场景切换 通知_一个基于V
- 下一篇: 外星人电脑怎么重装系统 【如何在外星电脑