队列的顺序存储实现
文章目錄
- 1 隊(duì)列的概念
- 2 隊(duì)列的順序存儲(chǔ)實(shí)現(xiàn)(非循環(huán)隊(duì)列)
- 2.1 對(duì)列初始化
- 2.2 判斷隊(duì)列是否為空
- 2.3 判斷對(duì)列是否滿
- 2.4 隊(duì)列入元素
- 2.5 隊(duì)列出元素
- 2.6 打印隊(duì)列元素
- 2.7 取隊(duì)首元素
- 2.8 清空隊(duì)列
- 2.9 獲取隊(duì)列長(zhǎng)度
- 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ì)列場(chǎng)景隨處可見(jiàn): 比如在電影院, 商場(chǎng), 或者廁所排隊(duì)。
2 隊(duì)列的順序存儲(chǔ)實(shí)現(xiàn)(非循環(huán)隊(duì)列)
順序存儲(chǔ):
- 采用數(shù)組來(lái)保存隊(duì)列的元素,設(shè)立一個(gè)隊(duì)首指針 front ,一個(gè)隊(duì)尾指針 rear,分別指向隊(duì)首和隊(duì)尾元素。則rear-front 即為存儲(chǔ)的元素個(gè)數(shù)!
2.1 對(duì)列初始化
#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ì)頭和隊(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ì)列是否滿
//判斷隊(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<<"無(wú)法插入元素 "<<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ì),后面的元素向前移動(dòng) 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++){//移動(dòng)后面的元素SQ->queue[i-1]=SQ->queue[i];}SQ->rear--;//隊(duì)尾指針前移一位return 1; }方式 2 - 刪除 front 所指的元素,然后加 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ì)列長(zhǎng)度
//獲取隊(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。
參考資料:
總結(jié)
- 上一篇: 电脑蓝屏怎么强制开机黑屏 电脑黑屏强制开
- 下一篇: 邮箱解决任务间资源共享问题