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;
}
根据入栈顺序判断出栈顺序的合法性
这道题不管是面试还是笔试的选择题都非常爱出的一道题
题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,5,2,3,1就不可能是该压栈序列的弹出序列。
输入:
每个测试案例包括3行:
第一行为1个整数n(1<=n<=100000),表示序列的长度。
第二行包含n个整数,表示栈的压入顺序。
第三行包含n个整数,表示栈的弹出顺序。
输出:
对应每个测试案例,如果第二个序列是第一个序列的弹出序列输出压栈弹栈顺序,否则输出这不可能
猜你喜欢
转载自www.linuxidc.com/Linux/2016-05/131596.htm
今日推荐
周排行