题目:
已知两个字母序列,一个是入栈序,一个是出栈序,把入栈序列按出现顺序压入一个栈,在入栈的任意过程中,允许栈中的字母出现,所有字母都是由大小写组成,并且不重复出现。现在需要判断已知的出栈序是不是合法的。
分析:借助一个栈,根据入栈序和出栈序模拟给定过程,拿着入栈序看此时要不要出栈,如果全过程模拟完毕顺利(入栈序走完,并且栈为空)说明合法,否则说明不合法。
//检查入队出队序列
#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;
}
}