1. 程式人生 > >stack和queue練習題

stack和queue練習題

1689: 2018藍橋杯培訓-STL應用專題-day 5 stack作業題2

描述

題目描述:

粗心的塔學長現在是火車站的排程員,看看現在的慘狀吧,列車車廂的順序竟然完全是亂的!為避免塔學長登上明天的UC頭條,車站劃分給塔塔一段如圖所示的鐵路,你能幫助塔塔把車廂的順序調整好嗎?

其中,A為入口,B為出口,S為中轉盲端。所有鐵道均為單軌單向式:列車行駛的方向只能是從A到S,再從S到B;另外,不允許超車。因為車廂可在S中駐留,所以它們從B端駛出的次序,可能與從A端駛入的次序不同。不過S的容量有限,同時駐留的車廂不得超過m節。

列車由編號依次為{1, 2, ..., n}的n節車廂組成。塔塔希望知道,按照以上交通規則,這些車廂能否以{a1, a2, ..., an}的次序,重新排列後從B端駛出。如果可行,應該以怎樣的次序操作?

 

輸入:

共兩行。 
第一行為兩個整數n,m。 
第二行為以空格分隔的n個整數,保證為{1, 2, …, n}的一個排列,表示待判斷可行性的駛出序列{a1,a2,…,an}。

 

輸出:

若駛出序列可行,則輸出操作序列,其中push表示車廂從A進入S,pop表示車廂從S進入B,每個操作佔一行。

若不可行,則輸出“震驚!昨天小湯河火車站竟然。。。”。

 

樣例輸入

5 2
1 2 3 5 4

樣例輸出

push
pop
push
pop
push
pop
push
push
pop
pop
#include<iostream>
#include<queue>
#include<stack>
using namespace std;

int main(){
	queue<int>q,q1;
	stack<int>s;
	int n,m,x;
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>x;
		q.push(x);
		q1.push(x);
	}
	int k=1;
	while(!q.empty()&&s.size()<m){	
		s.push(k++);
		while(!s.empty()&&!q.empty()&&s.top()==q.front()){
			s.pop();
			q.pop();
		}
	}
	if(!q.empty()){
		cout<<"震驚!昨天小湯河火車站竟然。。。"<<endl;
	}else{
		int k=1;
	while(!q1.empty()&&s.size()<m){		
	s.push(k++);
		cout<<"push\n";
		while(!s.empty()&&!q1.empty()&&s.top()==q1.front()){
			s.pop();
			q1.pop();
			cout<<"pop\n";
		}
	}	
	}
	return 0;
}

good