您的位置:首页 > 其它

判断出栈序列是否合理

2012-09-16 21:49 204 查看
题目描述(即判断是否是合理的出栈序列问题?)
有顺序排列的1,2,
3,…,n节车厢在入站口等待调度。车站设置了一个栈作为缓冲,这样的话只可能进行下列两个操作之一:
(1)如果还有车厢在入站口,将最前面的入栈缓冲
(2)将栈顶的车厢驶出车站
给定一个1至n的排列,问其作为出站序列是否合法。

注意:入站顺序为1,2, 3,…,n,即1先入栈...,n最后入栈。
输入
输入包含若干测试用例。每一个测试用例由多行组成。第一行是两个整数n(1<=n <= 100)和m,n表示入站序列为1至n。m表示随后有m行出站序列。
当n,m均为0时表示输入结束。
输出
对应每一个出站序列,合法则输出一行YES,否则输出一行NO。

样例输入
3
6
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
0
0
样例输出
YES
YES
YES
YES
NO
YES
方法:(1)模拟入栈和出栈的过程,对每种情况逐个判断;(2)判断“大小中”的情况,如果出现,则为非法序列。

#include<iostream>
#include<fstream>
#include<vector>
#include<stack>
using namespace std;

bool check(stack<int> & s, const vector<int> & in, const vector<int> & out, int n)
{
int j = 0;        //用于表示out的当前值

for(int i = 0; i < n; i++)
{
s.push(in[i]);
while(!s.empty() && s.top() == out[j])    //这里用while循环来保证有可以出的值时,可以连续出栈
{
s.pop();
j++;
}
}

//如果当前栈不为空,那么确定该组值不合法。
if(s.empty())
return true;
else
return false;
}

int main(int argc, char **argv)
{
ifstream fin(argv[1]);
int n, m;
while(1)
{
fin >> n >> m;
if( n == 0 && m == 0)
break;

vector<int> in;
for(int i = 1; i <= n; i++)
in.push_back(i);

int temp;
for(int i = 0; i < m; i++)
{
stack<int> s;        //局部变量,每次循环后被重置为空
vector<int> out;
for(int i = 0; i < n; i++)
{
fin >> temp;
out.push_back(temp);
}
if(check(s, in, out, n))
cout << "YES" << endl;
else
cout << "NO" << endl;

}

}

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: