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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

队列的顺序存储实现

發布時間:2025/4/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 队列的顺序存储实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 隊列的概念
    • 2 隊列的順序存儲實現(非循環隊列)
      • 2.1 對列初始化
      • 2.2 判斷隊列是否為空
      • 2.3 判斷對列是否滿
      • 2.4 隊列入元素
      • 2.5 隊列出元素
      • 2.6 打印隊列元素
      • 2.7 取隊首元素
      • 2.8 清空隊列
      • 2.9 獲取隊列長度
    • 3 循環隊列

1 隊列的概念

隊列是一種受限的線性表,(Queue),它是一種運算受限的線性表,先進先出(FIFO First In First Out):

  • 隊列是一種受限的線性結構。
  • 它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作。

生活中隊列場景隨處可見: 比如在電影院, 商場, 或者廁所排隊。


2 隊列的順序存儲實現(非循環隊列)

順序存儲:

  • 采用數組來保存隊列的元素,設立一個隊首指針 front ,一個隊尾指針 rear,分別指向隊首和隊尾元素。則rear-front 即為存儲的元素個數!

2.1 對列初始化

#define MaxSize 5 //隊列的最大容量typedef int DataType; //隊列中元素類型typedef struct Queue {DataType queue[MaxSize];int front; //隊頭指針int rear; //隊尾指針 }SeqQueue;//隊列初始化,將隊列初始化為空隊列 void InitQueue(SeqQueue *SQ) {if(!SQ) return ;SQ->front = SQ->rear = 0; //把對頭和隊尾指針同時置 0 }

2.2 判斷隊列是否為空

//判斷隊列為空 int IsEmpty(SeqQueue *SQ) {if(!SQ) return 0;if (SQ->front == SQ->rear){return 1;}return 0; }

2.3 判斷對列是否滿

//判斷隊列是否為滿 int IsFull(SeqQueue *SQ) {if(!SQ) return 0;if (SQ->rear == MaxSize){return 1;}return 0; }

2.4 隊列入元素

//入隊,將元素 data 插入到隊列 SQ 中 int EnterQueue( SeqQueue *SQ,DataType data){if(!SQ) return 0;if(IsFull(SQ)){cout<<"無法插入元素 "<<data<<", 隊列已滿!"<<endl;return 0;}SQ->queue[SQ->rear] = data; //在隊尾插入元素 dataSQ->rear++; //隊尾指針后移一位return 1; }

2.5 隊列出元素

方式 1 - 刪除 front 所指的元素, 后面所有元素前移 1 并返回被刪除元89素。

//出隊,將隊列中隊頭的元素 data 出隊,后面的元素向前移動 int DeleteQueue(SeqQueue* SQ, DataType *data){if(!SQ || IsEmpty(SQ)){cout<<"隊列為空!"<<endl;return 0;}if(!data) return 0;*data = SQ->queue[SQ->front];for(int i=SQ->front+1; i<SQ->rear; i++){//移動后面的元素SQ->queue[i-1]=SQ->queue[i];}SQ->rear--;//隊尾指針前移一位return 1; }

方式 2 - 刪除 front 所指的元素,然后加 1 并返回被刪元素。

//出隊,將隊列中隊頭的元素 data 出隊,出隊后隊頭指針 front 后移一位 int DeleteQueue2(SeqQueue* SQ,DataType* data) {if (!SQ || IsEmpty(SQ)){cout<<"隊列為空!"<<endl;return 0;}if(SQ->front>=MaxSize){cout<<"隊列已到盡頭!"<<endl;return 0;}*data = SQ->queue[SQ->front]; //出隊元素值SQ->front = (SQ->front)+1; //隊首指針后移一位return 1; }

2.6 打印隊列元素

//打印隊列中的各元素 void PrintQueue(SeqQueue* SQ) {if(!SQ) return ;int i = SQ->front;while(i<SQ->rear){cout<<setw(4)<<SQ->queue[i];i++;} cout<<endl; }

2.7 取隊首元素

//獲取隊首元素 int GetHead(SeqQueue* SQ,DataType* data) {if (!SQ || IsEmpty(SQ)){cout<<"隊列為空!"<<endl;}return *data = SQ->queue[SQ->front]; }

2.8 清空隊列

//清空隊列 void ClearQueue(SeqQueue* SQ) {SQ->front = SQ->rear = 0; }

2.9 獲取隊列長度

//獲取隊列中元素的個數 int getLength(SeqQueue* SQ){if(!SQ) return 0;return SQ->rear-SQ->front; }

3 循環隊列

循環隊列的操作示意圖如下:

循環隊列入隊, 隊尾循環后移:

  • SQ->rear =(SQ->rear+1)%Maxsize;

循環隊列出隊, 隊首循環后移:

  • SQ->front =(SQ->front+1)%Maxsize;

隊空:

  • SQ.front=SQ.rear; // SQ.rear 和 SQ.front 指向同一個位置

隊滿:

  • (SQ.rear+1) %Maxsize=SQ.front; // SQ.rear 向后移一位正好是 SQ.front

計算元素個數:

可以分兩種情況判斷:

  • 如果 SQ.rear>= SQ.front:元素個數為 SQ.rear-SQ.front;
  • 如果 SQ.rear<SQ.front:元素個數為 SQ.rear-SQ.front+ Maxsize;
  • 采用取模的方法把兩種情況統一為:(SQ.rear-SQ.front+Maxsize)% Maxsize。
#include <stdio.h> #include <assert.h> #include <Windows.h> #include <iostream> #include <iomanip>using namespace std;#define MaxSize 5 //循環隊列的最大容量typedef int DataType; //循環隊列中元素類型typedef struct Queue {DataType queue[MaxSize];int front; //循環隊頭指針int rear; //循環隊尾指針 }SeqQueue;//隊列初始化,將循環隊列初始化為空隊列 void InitQueue(SeqQueue* SQ) {if (!SQ) return;SQ->front = SQ->rear = 0; //把對頭和隊尾指針同時置 0 }//判斷隊列為空 int IsEmpty(SeqQueue* SQ) {if (!SQ) return 0;if (SQ->front == SQ->rear){return 1;}return 0; }//判斷循環隊列是否為滿 int IsFull(SeqQueue* SQ) {if (!SQ) return 0;if ((SQ->rear + 1) % MaxSize == SQ->front){return 1;}return 0; }//入隊,將元素 data 插入到循環隊列 SQ 中 int EnterQueue(SeqQueue* SQ, DataType data) {if (!SQ) return 0;if (IsFull(SQ)) {cout << "無法插入元素 " << data << ", 隊列已滿!" << endl;return 0;}SQ->queue[SQ->rear] = data; //在隊尾插入元素 dataSQ->rear = (SQ->rear + 1) % MaxSize; //隊尾指針循環后移一位return 1; }//出隊,將隊列中隊頭的元素 data 出隊,出隊后隊頭指針 front 后移一位 int DeleteQueue(SeqQueue* SQ, DataType* data) {if (!SQ || IsEmpty(SQ)){cout << "循環隊列為空!" << endl;return 0;}*data = SQ->queue[SQ->front]; //出隊元素值SQ->front = (SQ->front + 1) % MaxSize; //隊首指針后移一位return 1; }//打印隊列中的各元素 void PrintQueue(SeqQueue* SQ) {if (!SQ) return;int i = SQ->front;while (i != SQ->rear){cout << setw(4) << SQ->queue[i];i = (i + 1) % MaxSize;}cout << endl; }//獲取隊首元素,不出隊 int GetHead(SeqQueue* SQ, DataType* data) {if (!SQ || IsEmpty(SQ)){cout << "隊列為空!" << endl;}return *data = SQ->queue[SQ->front]; }//清空隊列 void ClearQueue(SeqQueue* SQ) {if (!SQ) return;SQ->front = SQ->rear = 0; }//獲取隊列中元素的個數 int getLength(SeqQueue* SQ) {if (!SQ) return 0;return (SQ->rear - SQ->front + MaxSize) % MaxSize; }int main() {SeqQueue* SQ = new SeqQueue;DataType data = -1;//初始化隊列InitQueue(SQ);//入隊for (int i = 0; i < 7; i++) {EnterQueue(SQ, i);}//打印隊列中的元素printf("隊列中的元素(總共%d 個):", getLength(SQ));PrintQueue(SQ);cout << endl;//出隊for (int i = 0; i < 5; i++) {if (DeleteQueue(SQ, &data)) {cout << "出隊的元素是:" << data << endl;}else {cout << "出隊失敗!" << endl;}}//打印隊列中的元素printf("出隊五個元素后,隊列中剩下的元素個數為 %d 個:",getLength(SQ));PrintQueue(SQ);cout << endl;//入隊 4 個for (int i = 0; i < 4; i++) {EnterQueue(SQ, i + 10);}printf("\n 入隊四個元素后,隊列中剩下的元素個數為 %d 個:",getLength(SQ));PrintQueue(SQ);system("pause");return 0; }

參考資料:

  • C/C++從入門到精通-高級程序員之路【奇牛學院】
  • 總結

    以上是生活随笔為你收集整理的队列的顺序存储实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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