前言
- 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。
- 个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer:
问题描述:
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
-
- 0<=pushV.length == popV.length <=1000
-
- -1000<=pushV[i]<=1000
-
- pushV 的所有数字均不相同
举例:
[1,2,3,4,5],[4,5,3,2,1]
true
[1,2,3,4,5],[4,3,5,1,2]
false
解法思路:
- 建立一个辅助栈,开始时,指针分别指向入栈数组pushV和出栈数组popV第一个元素,再让与当前出栈数组元素对应的入栈数组元素前的所有数入栈。此时栈顶元素与出栈数组元素相等,让栈顶元素出栈、出栈数组指针后移,继续判断直到不等。重复上述过程,直到入栈数组和出栈数组访问完毕,判断此时栈内是否还有元素。时间复杂度O(n),空间复杂度O(n)。
代码结果:
#include <stdbool.h>
bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) {
int stack[pushVLen],top=-1,top_in=0,top_out=0;
while(top_in<pushVLen && top_out<pushVLen){
while(top_in<pushVLen && pushV[top_in]!=popV[top_out]){
stack[++top]=pushV[top_in++];
}
stack[++top]=pushV[top_in++];
while(top>-1 && stack[top]==popV[top_out]){
top--;
top_out++;
}
}
if(top!=-1){
return false;
}
return true;
}
结束语
- 以上就是该C语言编程题的内容。可以在牛客尝试刷几道题目来练习实践。牛客网刷题(点击可以跳转),可以尝试注册使用。
- 题目来自:牛客/题库 / 在线编程 / 剑指offer: