题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
思路:
构建一个辅助栈,按顺序访问弹出栈序列,如果辅助栈栈顶元素和序列当前值相等,则弹出栈顶元素,否则按顺序访问压入栈序列,找到和弹出栈序列当前值相等的值的位置。如果找不到相等值则返回假。弹出序列所有元素访问完毕后如果没有假则返回真。
代码:
bool ispoporder(int* push, int* pop, int length)
{
if (push == nullptr || pop == nullptr || length <= 0) return false;
std::stack<int> stackdata;
int pushindex = 0;
for (int popindex = 0; popindex < length; popindex++)
{
if (stackdata.size()>0 && stackdata.top() == pop[popindex])
{
stackdata.pop();
continue;
}
while (pushindex < length && push[pushindex] != pop[popindex]) stackdata.push(push[pushindex++]);
if (pushindex < length) pushindex++;
else return false;
}
return true;
}