演算法訓練營——演算法一:棧程式
阿新 • • 發佈:2018-12-11
棧程式
時間限制:2s,空間256MB
問題描述 實現一個棧,完成以下功能: 入棧 出棧 查詢棧中位置Y是誰 一開始棧為空,棧中的位置從1開始(即棧底位置為1)。
輸入
第一行一個整數n,表示操作個數(1 <= n <= 100000) 接下來n行,每行第一個數字表示操作(見描述):
若為數字1,則接下來有一串字串X,表示將X壓入棧中。
若為數字2,表示彈出棧頂(保證棧非空),並輸出出棧的這個人。
若為數字3,則接下來有一個整數Y,表示詢問棧中位置Y是誰(保證位置Y合法),並輸出名字。
輸入樣例 :
11
1 a
1 b
1 c
3 1
3 2
3 3
2
1 d
3 1
3 2
3 3
思路輸出樣例:
a
b
c
c
a
b
d
這道棧程式出棧和入棧操作並不難,可以用Stack的pop和push完成,但是棧有個缺點就是對於下標操作不支援,所以查詢操作很麻煩,要想達到查詢操作時間複雜度為O(1)的話必須自己設計棧,我想到了通過陣列來模擬棧(將陣列平放,左邊為棧底,右邊為棧頂),不畫圖了,自行腦補。
程式碼實現
#include <iostream> #include <string> using namespace std; const int N=100005; string stack[N]; int n,top; //stack 棧 //top 棧頂位置 //入棧 void push(string name) { stack[++top]=name; } //彈出棧頂元素,並輸出名字 string pop() { return stack[top--]; } //查詢棧中第n個位置的名字,並輸出名字 string query( int n) { return stack[n]; } int main() { int n; scanf("%d",&n); char name[15];//記錄對應2操作要壓入棧的名字 for(;n--;)//這種for迴圈寫法會在n==0的時候終止 { int m; cin>>m; if(m==1) { cin>>name; push(name); } else if(m==2) { cout<<pop().c_str()<<endl;//String型別沒有過載 <<符號,那麼想要輸出有兩種方式:1、新增string庫。2、呼叫c_str()方法。 } else { int n; cin>>n; cout<<query(n).c_str()<<endl; } } return 0; }