思路说明:
这一题就是给定一个1~N排列,判定是否是1~n输入序列的出栈序列,其中1~n可以任意时刻出栈入栈,也是黑书上一道例题吧
详细解释:
对输入序列从头开始检索,fp是输入序列的下标,rp是输出序列的下标,并且新建一个栈
if( fp==rp)
fp++,rp++;
else{
while( !st.empty() && st.top()==oup[ip])
{
st.pop();
rp++;
}
st.push( inp[ip]);
}
易错点:
在扫描最后输入之后,仍要检查一次,是否可以从栈中弹出
测试数据的读取
个人收获:
之前做过类似的题目,练了下编码能力,逻辑可能会习惯一点
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int n,num,i,j;
int inp[1001],oup[1001];
bool first=true;
int rp,fp;
while(cin>>n && n!=0)
{
while(cin>>oup[1] && oup[1]!=0){
inp[1]=1;
for(i=2; i<=n; i++)
{
inp[i]=i;
cin>>oup[i];
}
stack<int> station;
rp=1;
for( fp=1; fp<=n; fp++)
{
if(inp[fp]==oup[rp])
rp++;
else{
while((!station.empty() )&&station.top()==oup[rp])
{
rp++;
station.pop();
}
station.push(inp[fp]);
}
}
while((!station.empty() )&&station.top()==oup[rp])
{
rp++;
station.pop();
}
if(rp>n)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
cout<<endl;
}
}