顺序出栈
Description
给出一个容量为m的栈和一个1~n的任意排列和,
将n个数按照给定排列压入栈中,请你求出其是否能
够以1,2,3…n的方式出栈。
Input
第一行给出n和m,其中1<=m<=n<=1000,
第二行给出长度为n的排列。
Output
如果给定的排列能以1,2,3…n的方式出栈,输出YES,
否则输出NO。
Sample Input 1
7 5
1 2 3 4 5 6 7
7 5
1 7 6 5 4 2 3
7 6
7 6 5 4 3 1 2
7 6
7 6 5 4 3 2 1
Sample Output 1
YES
YES
YES
NO
思路:可能是我入戏太深, 栈的出栈顺序可能本来就没搞懂再加上题意没看懂,才没做出来吧
本来以为会用到栈混洗(可判断出栈顺序是否合理),但是模拟就能做(能否按指定出栈顺序出栈)。
#include<bits/stdc++.h>
using namespace std;
queue<int> s; //开始的顺序
stack<int> t; //初始栈
queue<int> e; //结果顺序
int main(){
int n, m;
while(cin >> n >> m){
int temp;
for(int i = 0; i < n; i++){
cin >> temp;
s.push(temp);
}
int key = 1;
while(!s.empty()){
t.push(s.front());
s.pop();
//栈未满
if(t.size() < m){
if(t.top() == key){
e.push(key);
t.pop();
key++;
}
}
//栈已满
else if(t.size() == m){
if(t.top() != key){
e.push(t.top());
t.pop();
}else{
while(!t.empty()){
if(t.top() == key){
e.push(t.top());
t.pop();
key++;
}else{
break;
}
}
}
}
}
int cnt = 0;
while(!e.empty()){
cnt++;
if(e.front() != cnt){
break;
}
e.pop();
}
if(cnt != n){
cout << "NO" << endl;
}else{
cout << "YES" << endl;
}
}
return 0;
}