棧&隊列

隊列部分

普通隊列

  舉個形象的例子:排隊買票。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;
}

STL實現:

#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;
}

STL實現:

#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;
}

STL實現:

#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;
}
相關文章
相關標籤/搜索