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;
}