棧(stack)ios
棧是一種先進後出(FILO,即first-in-last-out)的數據結構,你能夠把它想象成一個只開一個口的乒乓球筒,每次只能從最頂端處放置或取出數據。算法
通常在OI中咱們用一個數組和棧頂指針(用int表示的下標)來模擬一個棧。數組
棧支持兩個操做:1.向棧頂加入一個元素 2.從棧頂取出一個元素這兩個操做的時間複雜度都是O(1)。數據結構
那麼它所維護的這個數據集合中,數據之間有什麼樣的關係呢?spa
很簡單,就是fisrt-in-last-out,或者更具體一點:若是一個元素在另外一個元素以前加入這個集合中,那麼它必定在那個元素以後退出這個集合。指針
總之,棧是一種只能在某一端插入和刪除的特殊線性表。用桶堆積物品,先堆進來的壓在底下,隨後一件一件往上堆,最後取走時,只能從上面一件一件取。code
棧就是一種相似桶堆積物品的數據結構,進行刪除和插入的一端稱爲棧頂,另外一端稱爲棧底。blog
插入通常稱爲進棧(PUSH),刪除則稱爲退棧(POP)。io
一個棧能夠用定長爲n的數組s來表示,用一個棧指針top指向棧頂。若top=0,表示棧空,top=n時棧滿。進棧時top加一。退棧時top減一。當top<0時下溢,棧指針在運算中永遠指向棧頂。ast
具體算法::
1.進棧算法(PUSH)
(1) 若top>=n時,則給出上溢信息,作出錯處理(進棧前首先檢查是否已經爲棧滿,滿則溢出,不滿則做(2))。
(2) top++(棧指針加一,指向進棧地址)。
(3) s[top]=x,結束(x爲新進棧元素)。
2.退棧算法(POP):
(1) 若top<=0時,則給出下溢信息,作出錯處理(進棧前首先檢查是否已經爲空棧,空則溢出,不滿則做(2))。
(2) x=s[top],(退棧後的元素賦給x)
(3) top--,結束(棧指針-1,指向棧頂)。
下面附上代碼:
#include<iostream> #include<cstdio> using namespace std; #define n 100 void push(int s[],int top,int x)//進棧 { if(top==n) cout<<"overflow"; else { top++; s[top]=x; } } void pop(int s[],int top,int y)//退棧 { if(top==0) cout<<"underflow"; else { y=s[top]; top--; } } int main() { ......//省略 }