参考POJ1363
简要分析:
一个序列需满足从小到大入栈,可随时出栈入栈。给出一个参考序列,是否存在按参考序列出栈的情况。
首先输入参考序列到数组,按1到N依次进栈,在进栈的过程中,如果等于参考序列当前的数,出栈,参考序列后移一位,如果还相等,继续出栈和后移。如果不等,则入栈。如果用栈,可以判断最后栈是否为空。用数组模拟,模拟计数出栈的个数。如果弹出个数相等,匹配成功。
下面用数组模拟入栈出栈:
代码:
#include<iostream>
using namespace std;
int main() {
int N;
while (cin >> N, N != 0) {
int Data[N], Temp[N + 1];
int i = 0, count = 0, k = 0;
while (cin >> Data[0], Data[0] != 0) {
for (i = 1; i < N; i++)
cin >> Data[i];
for (i = 1, k = 0, count = 0; i <= N && count < N; i++, k++) {
Temp[k] = i; //类比1到N的入栈
while (Temp[k] == Data[count]) //如果相等,下一个数还是存放在当前位置,k要-1
{
if (k > 0)
k--;
else {
Temp[k] = 0; //k=0,相当于栈空,避免存在相等的情况,重新初始化0;
k--;
}
count++; //类比弹栈的个数
if (k == -1)
break;
}
}
if (count == N) //弹出个数相等
cout << "Yes" << endl;
else
cout << "No" << endl;
}
cout << endl;
}
return 0;
}