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


这道题不管是面试还是笔试的选择题都非常爱出的一道题   题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,5,2,3,1就不可能是该压栈序列的弹出序列。 输入: 每个测试案例包括3行: 第一行为1个整数n(1<=n<=100000),表示序列的长度。 第二行包含n个整数,表示栈的压入顺序。 第三行包含n个整数,表示栈的弹出顺序。 输出: 对应每个测试案例,如果第二个序列是第一个序列的弹出序列输出压栈弹栈顺序,否则输出这不可能  

string Judge(int n_values, int input [],int output[])
{
                assert(input && output && n_values > 0);
                Stack<int ,100> s1;
                string result;
                s1.Push( input[0]);//为了防止数组越界访问造成崩溃,先将第一个数压栈开辟好数组空间
                result.append(1, 'R');//因为有入栈操作
                int out = 0;
                int in = 1;//因为有入栈操作,所以入栈数组计数加1
                while (out < n_values )//循环结束条件是完美的匹配了出栈顺序,出栈计数到达出栈数组末尾
                {
                                if (in > n_values )//如果入栈计数先到达入栈数组末尾,证明没有数可以再入栈,但此时出栈数组还没走完,说明这个出栈顺序根本不可能完成
                                {
                                                result = "这不可能!" ;
                                                return result;
                                }
                                if (s1.Top() == output [out])
                                {
                                                s1.Pop();//当前栈顶元素恰好和出栈顺序的一样,赶紧出栈
                                                result.append(1, 'C');
                                                out++;
                                }
                                else
                                {
                                                s1.Push( input[in]);//栈顶元素和出栈数组的当前指向不一致,只能继续入栈
                                                result.append(1, 'R');
                                                in++;
                                }
                }
                return result;
}

本文永久更新链接地址

相关内容

    暂无相关文章