这道题不管是面试还是笔试的选择题都非常爱出的一道题
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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