已知一个栈的输入序列,判断给定序列是否合法
- 思路为使用队列存储需要判断的序列,使用堆模拟入栈,当队列首元素和栈的元素相同时,说明当前元素的出栈是合法的,那么将堆栈和队列都pop(删除)一个元素,当所有元素入栈之后,如果队列或者堆栈不为空则说明这个序列是不合法的,否则合法。
#include<bits/stdc++.h>
using namespace std;
int main(){
queue<int>q;//使用队列是因为计算时需要从队首删除元素
int n;//元素个数
cin>>n;
//输入预测序列
for(int i=0;i<n;i++){
int item;
cin>>item;
q.push(item);
}
cout<<endl;
//入栈顺序 入栈的时候如果遇到相同的预测序列 两个都删除
//这李默认入栈序列是1,2,3,,,,n;
//你可以更改成你希望入栈的任何序列,只需要将 check.push(i);改成 check.push(inStack[i])
//instack[]可以是任意一个你希望的入栈序列
stack<int>check;
for(int i=1;i<=n;i++){
check.push(i);
while(!check.empty()&&check.top()==q.front()){
check.pop();
q.pop();
}
}
if(check.empty()){
cout<<"Yes"<<endl;
}else{
cout<<"NO"<<endl;
}
return 0;
//如果对你有帮助请记得点个赞
}