首先棧和佇列都是特殊的線性表,棧是乙個抽象的資料結構,先入後出,理解的話就像我們往桌子上放課本,先放的課本被壓在最底下最後才能拿出來,後放的課本在上面,最先拿出來。而佇列就相反,它是先入先出,顧名思義,就像我們一起排隊買東西,最先排隊的人先買到東西,買到後離開長長隊伍,最先逃離苦海,而最後排隊的人只能最後才能買到東西。
在stl裡面我們不需要自己定義頭尾指標,不需要自己設計函式實現棧和佇列內元素的增添和減少,相對而言使用起來更為簡便,下面介紹一下在stl裡面棧和佇列的定義和使用方法。
棧
標頭檔案:
宣告:stack《資料型別》棧名
基本函式:
empty() -- 返回bool型,表示棧內是否為空 (s.empty() )
size() -- 返回棧內元素個數 (s.size() )
top() -- 返回棧頂元素值 (s.top() )
pop() -- 移除棧頂元素(s.pop(); )
push(data_type a) -- 向棧壓入乙個元素 a(s.push(a); )
佇列:
標頭檔案:
宣告:queue《資料型別》佇列名
基本函式:
empty() -- 返回bool型,表示queue是否為空 (q.empty() )
size() -- 返回queue內元素個數 (q.size() )
front() -- 返回queue內的下乙個元素 (q.front() )
back() -- 返回queue內的最後乙個元素(q.back() ) 、
pop() -- 移除queue中的乙個元素(q.pop(); )
push(data_type a) -- 將乙個元素a置入queue中(q.push(a); )
棧和佇列在stl裡的函式幾乎都是類似的,但是需要注意的就是在如果使用的函式是要呼叫棧和佇列內的元素的時候,就需要先進行檢查棧和佇列是否為空的操作。我好幾個題就因為這個問題找不錯,還一直顯示執行錯誤。比如下面這個括號匹配問題
時間限制: 1000 ms 記憶體限制: 65536 kb
提交數: 12373 通過數: 3967假設表示式中允許包含兩種括號:圓括號和方括號,其巢狀的順序隨意,如([ ]())或[([ ][ ])]等為正確的匹配,[( ])或([ ]( )或 ( ( ) ) )均為錯誤的匹配。
現在的問題是,要求檢驗乙個給定表示式中的括弧是否正確匹配?
輸入乙個只包含圓括號和方括號的字串,判斷字串中的括號是否匹配,匹配就輸出 「ok」 ,不匹配就輸出「wrong」。輸入乙個字串:[([][])],輸出:ok。
輸入僅一行字元(字元個數小於255)。
匹配就輸出 「ok」 ,不匹配就輸出「wrong」。
[(])
wrong
先附上一段ac的正確**
#include #include #include #include #include using namespace std;
typedef long long ll;
stacks;
char str[10010000];
int main()
while(s.empty()&&a[i]==s.top())
這兩段**,前一段就執行錯誤,後面這一段就是正確的,雖然前一段**判斷了棧是否為空,但是,他是在執行s.top()之後進行的判斷,編譯器在讀取**時,除非有特殊要求就是按照從上到下從左到右的順序執行,因此,如果順序反了,一樣會存在執行錯誤的問題。
再附上一道佇列的題目
時間限制: 1000 ms 記憶體限制: 65536 kb
提交數: 4986 通過數: 2137
大樓的每一層樓都可以停電梯,而且第i層樓(1≤i≤n)(1≤i≤n) 上有乙個數字ki(0≤=ki≤=n)ki(0≤=ki≤=n) 。電梯只有四個按鈕:開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如:3 3 1 2 5
代表了ki(k1=3,k2=3,……)ki(k1=3,k2=3,……) ,從一樓開始。在一樓,按「上」可以到44 樓,按「下」是不起作用的,因為沒有−2−2 樓。那麼,從aa 樓到bb 樓至少要按幾次按鈕呢?
共有二行,第一行為三個用空格隔開的正整數,表示n,a,b(1≤n≤200,1≤a,b≤n)n,a,b(1≤n≤200,1≤a,b≤n) ,第二行為nn 個用空格隔開的正整數,表示kiki 。
一行,即最少按鍵次數,若無法到達,則輸出−1−1 。
5 1 53 3 1 2 5
3#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f
#define e 1e-12
#define n 1000001
#define ll long long
#define mod 10000
using namespace std;
int dp[301],x[301];
int main()
} if(i+x[i]<=n)}}
}}
cout 講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ... 佇列 又一種特殊的線性表 佇列 queue 是只允許在一端進行插入,而在另一端進行刪除的運算受限的線性表 允許刪除的一端稱為隊頭 front 允許插入的一端稱為隊尾 rear 當佇列中沒有元素時稱為空佇列。佇列的修改是依先進先出的原則進行的。新來的成員總是加入隊尾 即不允許 加塞 每次離開的成員總是... 列隊類 public class myqueue 帶引數構造方法,引數為陣列大小 public myqueue int maxsize 新增資料 從隊尾插入 public void insert int value arr end value 注意是 end 不是end element 刪除資料,從...棧和佇列 單調佇列 單調棧
棧和佇列 佇列
棧和佇列(佇列)