日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...

發布時間:2025/3/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

隊列 的定義:

一種可以是實現“先進先出”的存儲結構。數據的進出類似于排隊購票。隊只允許隊尾一端(rear)添加,在另一端隊頭(front)刪除。隊有隊頭(front)和隊尾(rear)兩個指針。隊頭front指向第一個元素,隊尾rear指向無實際意義的元素,即隊列最后一個元素的下一位置。

//隊列定義

typedef struct Queue

{

int *pBase;//數組基地址,數組的首地址

int front;//隊頭

int rear;//隊尾巴

}QUEUE;

//創建一個隊列,空間分配,保存6個整形元素。

void init (QUEUE *pQ)

{

pQ->pBase=(int*)malloc(sizeof(int)*6);//長度為6的數組

pQ->front=0;

pQ->rear=0;

}

隊列的分類:

分為動態隊列和靜態隊列兩種。動態隊列用鏈表實現。動態隊列易于實現。靜態隊列用數組實現,靜態隊列通常都必須是循環隊列。

靜態隊列為甚么必須是循環隊列?

數組實現靜態隊列,刪除元素時候,每刪除一位,front指針上移一位,浪費一個單位的數組空間。這種方式添加元素的時候rear上移一個,刪除元素的時候front上移一個。總之都是上移。

當front或者rear指到最上面一個位置,再上移就移動到最下面一個位置。所以數組實現隊列的時候必須是循環隊列,傳統方式實現不了。

2.循環隊列需要幾個參數來確定,及循環隊列各個參數的含義

隊列需要兩個參數確定,front和rear.2個參數不同的場合有不同的含義,建議初學者先記住,然后慢慢體會。

隊列初始化

Front和rear的值都是零

隊列非空

Front 代表的是隊列的第一個元素

Rear代表隊列的最后一個有效元素的下一個元素

隊列空

Front 和rear的值相等,但不一定是零。

2.循環隊列入隊偽算法講解

Rear=(rear+1)%數組的長度

//進隊,隊尾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;

}

}

循環隊列出隊偽算法講解

Front=(front+1)%數組的長度

//出隊,隊頭位置變為:(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.判斷循環隊列是否已空

Front與rear的值相等,則該隊列為空。

5.如何判斷循環對了是否已滿

預備知識 :由于是循環隊列,front的值可能比rear大,可能比rear小,也能相等,兩者沒有規律。但是隊首旋轉的速度不能比隊尾快。

當存放元素的數目等于數組的存儲位置個數,則rear和front重合。分不清頭和尾。

所以我們少用一個存儲位置。

c語言偽算法表示是:

隊列滿的條件:if ((rear+1)%數組長度==front)已滿

Else 不滿

#include

#include

#include"stdbool.h"//解決不能使用bool

#include "malloc.h"

//隊定義

typedef struct Queue

{

int *pBase;//數組基地址,數組的首地址

int front;//隊頭

int rear;//隊尾巴

}QUEUE;

void init(QUEUE*);//創建循環隊列

bool en_queue(QUEUE*,int ); //入隊

void traverse_queue(QUEUE*);//遍歷

bool emput_queue(QUEUE* );//隊是否滿

bool full_queue(QUEUE *);//對列是否空

bool out_queue(QUEUE *,int *);//出隊

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("出隊成功,出隊的元素是%dn",Val);

traverse_queue(&Q );//遍歷

}

return 0;

}

//創建一個隊列,空間分配,保存6個整形元素。

void init (QUEUE *pQ)

{

pQ->pBase=(int*)malloc(sizeof(int)*6);//長度為6的數組

pQ->front=0;

pQ->rear=0;

}

//判斷循環隊列是否滿

bool full_queue(QUEUE *pQ)

{

if((pQ->rear+1)%6==pQ->front)

{

return true;

}

else

return false;

}

//進隊,隊尾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;

}

}

//利用中間變量,遍歷隊列

void traverse_queue(QUEUE *pQ)

{

printf("隊列遍歷結果如下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;

}

//出隊,隊頭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;

}

}

總結

以上是生活随笔為你收集整理的循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。