根据入栈顺序判断出栈顺序的合法性

这道题不管是面试还是笔试的选择题都非常爱出的一道题
 
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,5,2,3,1就不可能是该压栈序列的弹出序列。
输入:
每个测试案例包括3行:
第一行为1个整数n(1<=n<=100000),表示序列的长度。
第二行包含n个整数,表示栈的压入顺序。
第三行包含n个整数,表示栈的弹出顺序。
输出:
对应每个测试案例,如果第二个序列是第一个序列的弹出序列输出压栈弹栈顺序,否则输出这不可能
 
 
 1 string Judge(int n_values, int input [],int output[])
 2 {
 3                  assert(input && output && n_values > 0);
 4                  Stack<int ,100> s1;
 5                  string result;
 6                 s1.Push( input[0]);//为了防止数组越界访问造成崩溃,先将第一个数压栈开辟好数组空间
 7                 result.append(1, 'R');//因为有入栈操作
 8                  int out = 0;
 9                  int in = 1;//因为有入栈操作,所以入栈数组计数加1
10                  while (out < n_values )//循环结束条件是完美的匹配了出栈顺序,出栈计数到达出栈数组末尾
11                 {
12                                  if (in > n_values )//如果入栈计数先到达入栈数组末尾,证明没有数可以再入栈,但此时出栈数组还没走完,说明这个出栈顺序根本不可能完成
13                                 {
14                                                 result = "这不可能!" ;
15                                                  return result;
16                                 }
17                                  if (s1.Top() == output [out])
18                                 {
19                                                 s1.Pop();//当前栈顶元素恰好和出栈顺序的一样,赶紧出栈
20                                                 result.append(1, 'C');
21                                                 out++;
22                                 }
23                                  else
24                                 {
25                                                 s1.Push( input[in]);//栈顶元素和出栈数组的当前指向不一致,只能继续入栈
26                                                 result.append(1, 'R');
27                                                 in++;
28                                 }
29                 }
30                  return result;
31 }
32  
原文地址:https://www.cnblogs.com/lenomirei/p/5354262.html