判断出栈序列是否合理

题目描述(即判断是否是合理的出栈序列问题?)
有顺序排列的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)判断“大小中”的情况,如果出现,则为非法序列。

 1 #include<iostream>
 2 #include<fstream>
 3 #include<vector>
 4 #include<stack>
 5 using namespace std;
 6 
 7 bool check(stack<int> & s, const vector<int> & in, const vector<int> & out, int n)
 8 {
 9     int j = 0;        //用于表示out的当前值
10 
11     for(int i = 0; i < n; i++)
12     {
13         s.push(in[i]);
14         while(!s.empty() && s.top() == out[j])    //这里用while循环来保证有可以出的值时,可以连续出栈
15         {
16             s.pop();
17             j++;
18         }
19     }
20 
21     //如果当前栈不为空,那么确定该组值不合法。
22     if(s.empty())
23         return true;
24     else
25         return false;
26 }
27 
28 int main(int argc, char **argv)
29 {
30     ifstream fin(argv[1]);
31     int n, m;
32     while(1)
33     {
34         fin >> n >> m;
35         if( n == 0 && m == 0)
36             break;
37 
38         vector<int> in;
39         for(int i = 1; i <= n; i++)
40             in.push_back(i);
41         
42         int temp;
43         for(int i = 0; i < m; i++)
44         {
45             stack<int> s;        //局部变量,每次循环后被重置为空
46             vector<int> out;
47             for(int i = 0; i < n; i++)
48             {
49                 fin >> temp;
50                 out.push_back(temp);
51             }
52             if(check(s, in, out, n))
53                 cout << "YES" << endl;
54             else
55                 cout << "NO" << endl;
56 
57         }
58         
59     }
60 
61     system("pause");
62     return 0;
63 }

 

 

 

posted @ 2012-09-16 21:49  dandingyy  阅读(2240)  评论(0编辑  收藏  举报