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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

队列的顺序存储实现

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

文章目錄

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

1 隊(duì)列的概念

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

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

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


2 隊(duì)列的順序存儲實(shí)現(xiàn)(非循環(huán)隊(duì)列)

順序存儲:

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

2.1 對列初始化

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

2.2 判斷隊(duì)列是否為空

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

2.3 判斷對列是否滿

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

2.4 隊(duì)列入元素

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

2.5 隊(duì)列出元素

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

//出隊(duì),將隊(duì)列中隊(duì)頭的元素 data 出隊(duì),后面的元素向前移動 int DeleteQueue(SeqQueue* SQ, DataType *data){if(!SQ || IsEmpty(SQ)){cout<<"隊(duì)列為空!"<<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--;//隊(duì)尾指針前移一位return 1; }

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

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

2.6 打印隊(duì)列元素

//打印隊(duì)列中的各元素 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 取隊(duì)首元素

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

2.8 清空隊(duì)列

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

2.9 獲取隊(duì)列長度

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

3 循環(huán)隊(duì)列

循環(huán)隊(duì)列的操作示意圖如下:

循環(huán)隊(duì)列入隊(duì), 隊(duì)尾循環(huán)后移:

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

循環(huán)隊(duì)列出隊(duì), 隊(duì)首循環(huán)后移:

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

隊(duì)空:

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

隊(duì)滿:

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

計(jì)算元素個(gè)數(shù):

可以分兩種情況判斷:

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

參考資料:

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

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。