已知从1至n的数字序列,按顺序入栈,每个数字入栈后即可出栈,也可在栈中停留,等待后面的数字入栈出栈后,该数字再出栈,求该数字序列的出栈序列是否合法?
思路:
1.用队列存储出栈序列
2.按元素顺序,将元素push到栈中
3.每push一个元素,就检查其是否和队列头部元素相同,相同的话就弹出栈顶,队首元素,直到两个元素不相同为止。
4.如果最后栈中元素为空,则序列合法,否则不合法
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
bool check_is_valid_order(queue<int> order) {
stack<int> s;
int n = order.size();
for(int i = 1; i <=n; i++) {
s.push(i);
while(!s.empty && s.top() == order.front()) {
s.pop();
order.pop();
}
}
if(s.empty()) {
return true;
}
return false;
}
int main(void){
int n;
int train;
cin>>n;
while(n) {
cin>>train;
while(train) {
queue<int> order;
order.push(train);
for(int i = 1; i < n; i++) {
cin>>train;
order.push(train);
}
if(check_is_valid_order(order)) {
cout<<"yes"<<endl;
}
else {
cout<<"No"<<endl;
}
cin>>train;
}
cin>>n;
}
return 0;
}