判断出栈序列是否合理
题目描述(即判断是否是合理的出栈序列问题?)
有顺序排列的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 }