题目:

已知两个字母序列,一个是入栈序,一个是出栈序,把入栈序列按出现顺序压入一个栈,在入栈的任意过程中,允许栈中的字母出现,所有字母都是由大小写组成,并且不重复出现。现在需要判断已知的出栈序是不是合法的。

分析:借助一个栈,根据入栈序和出栈序模拟给定过程,拿着入栈序看此时要不要出栈,如果全过程模拟完毕顺利(入栈序走完,并且栈为空)说明合法,否则说明不合法。

//检查入队出队序列
#include <stack>
void is_valid()
{
	int T;
	cin >> T;
	cin.get();//去掉换行符'/n'
	while (T--)
	{
		string s1;
		string s2;
 
		getline(cin, s1);
		getline(cin, s2);
 
		int x = 0;//入栈的下标
		int y = 0;//出栈的小标
		
		stack<char> s;
 
		while (x < s1.size())//要将入栈数据进行完
		{
			s.push(s1[x++]);//入栈
			while (!s.empty() && s.top() == s2[y])//入栈序等于出栈序,则后移出栈序,并且出栈
			{
				s.pop();
				y++;
			}
		}
		//此时当栈为空时,说明都匹配完了
		if (s.empty())
			cout << "Y" << endl;
		else
			cout << "N" << endl;
	}
}