🚀 个人主页:阿阿阿阿锋的主页_CSDN
🔥 文章作为刷题笔记,如有问题欢迎指出,
🔥 希望能和大家一起加油,一起进步!
🌍 另外,给大家推荐一款神器:《牛客网》
🌍 无论是面试,还是刷题学习,都非常好用。而且调试在线编程题时,是可以对比测试数据对应的正确输出的。
描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列
1
,
2
,
3
,
4
,
5
1,2,3,4,5
1,2,3,4,5是某栈的压入顺序,序列
4
,
5
,
3
,
2
,
1
4,5,3,2,1
4,5,3,2,1是该压栈序列对应的一个弹出序列,但
4
,
3
,
5
,
1
,
2
4,3,5,1,2
4,3,5,1,2就不可能是该压栈序列的弹出序列。
示例1
输入:
[1,2,3,4,5],[4,5,3,2,1]
返回值:
true
说明:
可以通过push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()
这样的顺序得到[4,5,3,2,1]这个序列,返回true
示例2
输入:
[1,2,3,4,5],[4,3,5,1,2]
返回值:
false
说明:
由于是[1,2,3,4,5]的压入顺序,[4,3,5,1,2]的弹出顺序,要求4,3,5必须在1,2前压入,且1,2不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false
通过判断能否画出一颗树,来判断两个序列是否匹配
感觉突然就和树联系起来了,比较有趣,因此记录一下。
但仅仅是解决这个栈的问题,还有更棒的方法。
作为一个关于栈的问题,真正用到栈才正常
push
,弹出序列为pop
,使用的辅助栈为stack
算法过程:
push
的第一个元素开始遍历,将一个元素压入stack
中stack
的栈顶元素,与pop
中还未成功匹配的首个元素stack
中弹出该元素,且该元素在pop
中作为已成功匹配的元素。然后重复匹配操作。push
中元素全部入栈后,栈为空,则两个序列匹配(也可以试试看这篇题解,里面有过程图)
/**
* @param pushV int整型一维数组
* @param pushVLen int pushV数组长度
* @param popV int整型一维数组
* @param popVLen int popV数组长度
* @return bool布尔型
*/
bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) {
int stack[1001] = {}; //辅助栈
int top = -1; //栈顶指针
int i, j; //i迭代push,j迭代pop
for(i = 0, j = 0; i < pushVLen; i++){
stack[++top] = pushV[i];
while(top != -1 && stack[top] == popV[j]){
j++;
stack[top--] = 0;
}
}
if(j == popVLen) {
return true;
}
else {
return false;
}
}
感谢阅读