队列的顺序存储实现
文章目錄
- 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 并返回被刪元素。
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。
參考資料:
總結
- 上一篇: 电脑蓝屏怎么强制开机黑屏 电脑黑屏强制开
- 下一篇: 邮箱解决任务间资源共享问题