舉個形象的例子:排隊買票。ios
有一列人在排隊買票,前面來的人買完票就離開,後面來的人須要站在最後……依次類推。數組
在計算機中,數據結構隊列有一個頭指針和尾指針,頭指針加一就表明有一個數據出隊了(人買完票),尾指針加一就表明有一共數據入隊了。數據結構
隊列,是一種線性表結構。它的主體是一個數組,第一個隊內元素所在的位置叫作隊首,而最後一個元素所在的位置叫作隊尾。隊列容許在隊首隊尾進行操做。所以,隊列具備一個特殊而重要的性質FIFO(先進先出)。測試
普通隊列大概是這個樣子的:spa
#include <iostream> using namespace std; struct queue//將隊列封裝在一個結構體中 { int head=0,tail=0;//head表明頭指針,tail表明尾指針 int a[100];//隊列元素存儲於此 void pop(){head++;}//彈出隊頭元素 void push(int num){a[tail]=num;tail++;}//在隊尾插入元素 int size(){return tail-head;}//判斷隊列元素個數 int back(){return a[tail-1];}//返回隊尾元素 int front(){return a[head];}//返回隊頭元素 bool empty(){if(head==tail)return true;return false;}//判斷隊列是否爲空 }; int main() { //測試手寫隊列 queue q; q.push(1); cout<<q.front()<<endl; q.pop(); if(q.empty())q.push(2); cout<<q.front()<<endl; q.push(3); cout<<q.back()<<endl; cout<<q.size(); return 0; }
#include <iostream> #include <algorithm> #include <queue> using namespace std; int main() { queue<int>q; q.pop();//彈出隊頭元素 q.push(1);//將1這個元素插入隊尾 q.size();//判斷隊列元素個數 q.front();//返回隊頭元素 q.back();//返回隊尾元素 q.empty();//判斷隊列是否爲空 return 0; }
顧名思義,單調隊列能夠保證隊內元素時刻保持單調(單調遞增、單調遞減、單調非減、單調非增)。指針
單調隊列雖然叫「隊列」,但其實和隊列有很大差異:爲了保證隊內元素單調,會強行捨棄隊中的一些元素。這點與FIFO的隊列有很大不一樣,因此應該把單調隊列看做是原數列的一個單調子序列。code
另外,與普通隊列不一樣的是,單調隊列能夠在隊頭和隊尾插入和刪除元素。blog
顧名思義,優先隊列就是指隊列中的每個元素都有一個優先級,優先級能夠是最大的元素優先級最大,也能夠是最小的元素優先級最大,具體看優先隊列的定義。隊列
優先隊列,其實在本質上與堆沒有多大的區別。it
#include <iostream> #define cmp(a,b) (a>b)//若是要修改元素優先級,在這裏修改 #define sort(h,t) for(int i=t-1;cmp(a[i],a[i-1])&&i>=h;i--)swap(a[i],a[i-1]) using namespace std; struct priority_queue//默認最大的元素優先級最大的優先隊列 { int head=0,tail=0;//head表明頭指針,tail表明尾指針 int a[100];//隊列元素存儲於此 void pop(){head++;}//彈出隊頭元素 void push(int num){a[tail]=num;tail++;sort(head,tail);}//在隊尾插入元素,改變元素優先級 int size(){return tail-head;}//判斷隊列元素個數 int top(){return a[head];}//返回隊頭(優先級最高)的元素 bool empty(){if(head==tail)return true;return false;}//判斷隊列是否爲空 }; int main() { //測試 priority_queue q; q.push(1);q.push(2);q.push(3); cout<<q.size()<<endl; cout<<q.top()<<endl; q.pop(); cout<<q.top()<<endl; q.pop(); cout<<q.top()<<endl; q.pop(); if(q.empty())q.push(1); cout<<q.top(); return 0; }
#include <iostream> #include <queue> using namespace std; int main() { priority_queue<int>q; q.pop();//彈出隊頭元素 q.push(1);//將1這個元素插入隊尾 q.size();//判斷隊列元素個數 q.top();//返回隊頭(優先級最高)的元素 q.empty();//判斷隊列是否爲空 return 0; }
棧,是一種數據結構,它具備先進後出(FILO)的特性,意思是,第一個進入的元素,是最後出來的,這與隊列徹底是相反的。
舉個形象的例子:從羽毛球筒裏拿羽毛球。
有一個羽毛球筒,只有一個開口,裏面放滿了羽毛球,這時,你想拿最底下的羽毛球,你會怎麼作呢?
答案是:把前面全部的羽毛球都拿出來,最後拿最底下的。
這就運用了棧的思想,棧最主要的特色就是先進後出(FILO)。
棧大概長這樣:
#include <iostream> using namespace std; struct stack//將棧封裝在一個結構體當中 { int a[100];//棧元素存在此中 int Top=0;//棧頂 void pop(){Top--;};//彈出棧頂元素 void push(int num){a[Top]=num;Top++;}//將元素插入棧頂 int top(){return a[Top];}//返回棧頂元素 int size(){return Top;}//判斷棧元素個數 bool empty(){if(!Top)return true;return false;}//判斷棧是否爲空 }; int main() { //測試 stack s; s.push(1); cout<<s.top()<<endl<<s.size()<<endl; s.pop(); if(s.empty())s.push(2); cout<<s.top(); return 0; }
#include <iostream> #include <stack> using namespace std; int main() { stack<int>s; s.pop();//彈出棧頂元素 s.push(1);//將1這個元素插入棧頂 s.top();//返回棧頂元素 s.size();//判斷棧元素個數 s.empty();//判斷棧是否爲空 return 0; }