数据结构【队列专题】
生活随笔
收集整理的這篇文章主要介紹了
数据结构【队列专题】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先進先出(First In First Out,FIFO)的線性序列,成為“隊列”。
隊列也是一種線性表,只不過它是操作受限的線性表,只能在兩端操作:
一端進,一端出。進的一端成為隊尾(rear),出的一端稱為隊頭(front)。隊列可以用順序存儲,也可以用鏈式存儲。
循環隊列?
#include <iostream> using namespace std; #define Maxsize 100typedef struct SqQueue {int *base; //基地址int front, rear; //頭指針,尾指針 }SqQueue;//循環隊列的初始化 bool InitQueue(SqQueue &Q)//注意使用引用參數,否則出了函數,其改變無效 {Q.base = new int[Maxsize];//分配空間if (!Q.base) return false;Q.front = Q.rear = 0; //頭指針和尾指針置為零,隊列為空return true; }//循環隊列的入隊 bool EnQueue(SqQueue &Q, int e)//將元素e放入Q的隊尾 {if ((Q.rear + 1) % Maxsize == Q.front) //尾指針后移一位等于頭指針,表明隊滿return false;Q.base[Q.rear] = e; //新元素插入隊尾Q.rear = (Q.rear + 1) % Maxsize; //隊尾指針加1return true; }//循環隊列的出隊 bool DeQueue(SqQueue &Q, int &e) //刪除Q的隊頭元素,用e返回其值 {if (Q.front == Q.rear)return false; //隊空e = Q.base[Q.front]; //保存隊頭元素Q.front = (Q.front + 1) % Maxsize; //隊頭指針加1return true; }//取循環隊列的隊頭元素 int GetHead(SqQueue Q)//返回Q的隊頭元素,不修改隊頭指針 {if (Q.front != Q.rear) //隊列非空return Q.base[Q.front];return -1; } //循環隊列的長度 int QueueLength(SqQueue Q) {return (Q.rear - Q.front + Maxsize) % Maxsize; }int main() {SqQueue Q;int n, x;InitQueue(Q);//初始化隊列(一定要初始化,否則后面存儲出錯)cout << "請輸入元素個數n:" << endl;cin >> n;cout << "請依次輸入n個整型數,依次入隊:" << endl;while (n--){cin >> x;EnQueue(Q, x);//入隊}cout << endl;cout << "隊列內元素個數,即長度:" << QueueLength(Q) << endl;cout << "隊頭元素:" << GetHead(Q) << endl;cout << "元素依次出隊:" << endl;while (true)//如果棧不空,則依次出棧{if (DeQueue(Q, x))cout << x << "\t";//出隊元素elsebreak;}cout << endl;cout << "隊列內元素個數,即長度:" << QueueLength(Q) << endl;return 0; }單調隊列
//常見模型:找出滑動窗口中的最大值/最小值int hh = 0, tt = -1;for (int i = 0; i < n; i ++ ){while (hh <= tt && check_out(q[hh])) hh ++ ; // 判斷隊頭是否滑出窗口while (hh <= tt && check(q[tt], i)) tt -- ;q[ ++ tt] = i;}詳解單調隊列算法
總結
以上是生活随笔為你收集整理的数据结构【队列专题】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于RTP的QOS算法简介
- 下一篇: 简单很开心快乐的网名89个