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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

队列及其操作

發布時間:2025/3/21 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 队列及其操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

隊列

隊列的定義

隊列簡稱隊,是一種受限制的線性表,僅允許在表的一端插入,在表的另一端進行刪除。

  • 進行插入的一端叫做隊頭
  • 進行刪除的一端叫做隊尾

隊的特點

  • 先進先出(FIFO)

順序隊(循環隊列)

順序隊主要以循環隊列的形式出現

循環隊列的要素

  • 隊空狀態 qu.rear == qu.front
  • 隊滿狀態 (qu.rear+1)%MAXSIZE == qu.front

結構體定義

#define MAXSIZE 1024typedef struct _Queue {int data[MAXSIZE]; //數據int front; //隊首指針int rear; //隊尾指針 }SqQueue;

操作

采用 p = (p+1)%MAXSIZE;而不是p++的方式移動指針是為了能保證循環再利用性,使其在超過MAXSIZE后能重新回到原始位置

否則一個隊只存滿再全部取出后就不能再利用了

初始化

//初始化循環隊列 void initQueue(SqQueue &qu) {qu.front = qu.rear = 0; }

判斷隊空

//判斷隊空 //隊空返回真,否則返回假 bool isQueueEmpty(SqQueue qu) {if(qu.front == qu.rear) return true;else return false; }

判斷隊滿

//判斷隊滿 //隊滿返回真,否則假 bool isQueueFull(SqQueue qu) {if((qu.rear + 1) % MAXSIZE == qu.front)return true;elsereturn false; }

進隊

//進隊 bool enQueue(SqQueue &qu, int e) {//判斷隊滿if(isQueueFull(qu)) return false;//若未滿,先移動尾指針再存元素qu.rear = (qu.rear + 1) % MAXSIZE;qu.data[qu.rear] = e;return true; }

出隊

//出隊 bool deQueue(SqQueue &qu, int &e) {//判斷隊空if(isQueueEmpty(qu)) return false;//若不為空,則先移動頭指針(因為等于0的時候并無元素,所以可以先移動指針)qu.front = (qu.front + 1) % MAXSIZE;e = qu.data[qu.front];return true; }

鏈隊

鏈隊的要素

  • 隊空狀態 lqu->rear == NULL 或 lqu->front == NULL
  • 隊滿狀態不存在(假設內存無限大)

結構體定義

//儲存數據的鏈隊結點 typedef struct QNode {int data; //數據域struct QNode *next; //指針域 }QNode;//頭結點定義,用于指示隊頭和隊尾 typedef struct _LiQueue {QNode *front;QNode *rear; }LiQueue;

操作

初始化

//初始化 bool initQueue(LiQueue* &lqu) {lqu = new LiQueue;if(!lqu) return false;lqu->front = lqu->rear = NULL;return true; }

判斷隊空

//判斷隊空,隊空返回真,否則假 bool isQueueEmpty(LiQueue *lqu) {if(!lqu->rear || !lqu->front)return true;elsereturn false; }

進隊

//入隊 bool enQueue(LiQueue* &lqu, int e) {QNode *node = new QNode;if(!node) return false;node->data = e;node->next = NULL;//若隊為空,則新結點即時隊首結點又是隊尾結點if(!lqu->rear)lqu->rear = lqu->front = node;else{lqu->rear->next = node;lqu->rear = node;}return true; }

出隊

//出隊 bool deQueue(LiQueue* &lqu, int &e) {QNode *p;//判斷隊空if(!lqu->rear) return false;else p = lqu->front;//當隊中只有一個保存數據的結點時需特殊操作if(lqu->front == lqu->rear)lqu->rear = lqu->front = NULL;elselqu->front = lqu->front->next;e = p->data;delete p;return true; }

總結

以上是生活随笔為你收集整理的队列及其操作的全部內容,希望文章能夠幫你解決所遇到的問題。

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