判断栈的出栈顺序是不是正确
一、问题描述:
两个数组pPush和pPop分别存储了压栈序列和出栈序列,如何判断出栈序列是否正确,假设元素不重复。
二、举例:
pPush中序列为:[5 9 1 8 13 4 2 1]
那么给出一个出栈序列pPop:[8 4 1 2 13 1 9 5],这个出栈序列是正确的。
给出一个pPop:[8 4 1 2 13 5 9 1],这个出栈序列就是错误的,因为8第一个出栈,说明栈中尚有5 9 1三个元素,
它们的出栈顺序必须满足 1 9 5 这个顺序,但是出栈队列中确实5 9 1 的顺序出栈。
三、算法思路:
需要用到一个辅助栈stackData来存储尚未出栈的元素
1、对出栈序列进行遍历,第一个元素是8,说明前面已经存过5 9 1,将它存入辅助栈中
stackData: 1 5 9】 (“】”代表开口方向向左)
2、遍历第二个元素是4,它不是stackData中的第一个top元素1,说明新压入了元素,那么容易知道4之前的元素13已经被压入栈中,所以将13压入辅助栈
stackData: 13 1 5 9】
3、遍历第三个元素是1,不是stackData中的第一个top元素13,说明新压入了元素,那么容易知道1之前的元素2已经被压入栈中,所以将2压入辅助栈
stackData: 2 13 1 5 9】
也要注意到,此时1已经到达了压栈序列的最后一个元素,那么容易知道最后的出栈序列必须和 stackData的出栈序列一致,否则可以判断出栈序列不正确
根据前面的步骤我们可以得到伪代码如下:
四、伪代码
int j = -1;
for遍历出栈序列
if (辅助栈空 || 辅助栈top元素不等于pPop[i] //说明要向辅助栈中存元素)
while (pPush[++j] 不等于pPop[i])
pPush[j]压入辅助栈
else //辅助栈top元素等于pPop[i],要弹出元素了
辅助栈弹出一个元素
五、c++代码