POJ-1363 地址:http://poj.org/problem?id=1363
直接贴关键代码来分析: int j=0;
for(int i=0;i<n;i++)
{
s.push(i+1);
while(!s.empty() && s.top()==num[j])
{
s.pop();
j++;
}
}
上面这个for循环模拟,可以判断出栈顺序的合法性,比较s.top和num[j],其中,主要看计数器j的次数是否与n相等。表达能力不是很强,有思路更清晰的可以评论交流一下。
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int n;
int num[1005];
while(scanf("%d",&n)!=0,n)
{
while(1)
{
int x;
cin>>x;
if(x==0)
{//输入零结束
break;
}
else
{//num用来存储样例输入
num[0]=x;
for(int i=1;i<n;i++)
{//数组num用来存储测试用例
cin>>num[i];
}
}
stack<int>s;
int j=0;
for(int i=0;i<n;i++)
{//注意:这个for循环模拟,是本代码的灵魂所在
s.push(i+1);//将火车编号压栈,按顺序一次压一个
while(!s.empty() && s.top()==num[j])
{//将栈顶与编号num[j]比较,相等则删除栈顶,num的计数+1
s.pop();
j++;
}
}
if(j==n)
{//如果正好匹配
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
while(!s.empty())
{//清空后,方便下一次模拟
s.pop();
}
}
cout<<endl;
}
return 0;
}