1. 程式人生 > >演算法訓練營——演算法一:棧程式

演算法訓練營——演算法一:棧程式

棧程式

時間限制: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;
}