基础进出栈问题
思路:
建立一个辅助栈,开始时,指针分别指向入栈数组pushV和出栈数组popV第一个元素,再让与当前出栈数组元素对应的入栈数组元素前的所有数入栈。此时栈顶元素与出栈数组元素相等,让栈顶元素出栈、出栈数组指针后移,继续判断直到不等。重复上述过程,直到入栈数组和出栈数组访问完毕,判断此时栈内是否还有元素。时间复杂度O(n),空间复杂度O(n)。
#include <stdbool.h>
bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) {
// write code here
int stack[pushVLen],top=-1,top_in=0,top_out=0;//建立辅助栈stack,top为栈顶指针,top_in为入栈数组pushV的指针,top_out为出栈数组popV的指针
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;
}
优化:
分析代码可以看出:因为进栈数组指针不会回退,且不会出现出来的数比进去的数多的情况。因此可以直接把进栈数组当作辅助栈,在该数组上进行上述操作,这样可以节省一个额外的栈开销。时间复杂度O(n),空间复杂度O(1)。
C:
#include <stdbool.h>
bool IsPopOrder(int* pushV, int pushVLen, int* popV, int popVLen ) {
// write code here
int top=-1,top_in=0,top_out=0;//以pushV为辅助栈,top为栈顶指针,top_in为入栈数组pushV的指针,top_out为出栈数组popV的指针
while(top_in<pushVLen && top_out<pushVLen){
while(top_in<pushVLen && pushV[top_in]!=popV[top_out]){
//与当前出栈数组元素对应的入栈数组元素前的所有数入栈
pushV[++top]=pushV[top_in];
top_in++;
}
pushV[++top]=popV[top_out];
top_in++;
while(top>-1 && pushV[top]==popV[top_out]){
//栈顶元素若与出栈数组元素相等就出栈
top--;
top_out++;
}
}
return top==-1?true:false;//栈不为空匹配失败
}
C++:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int top=-1,top_in=0,top_out=0;
while(top_in<pushV.size() && top_out<pushV.size()){
while(top_in<pushV.size() && pushV[top_in]!=popV[top_out]){
pushV[++top]=pushV[top_in];
top_in++;
}
pushV[++top]=popV[top_out];
top_in++;
while(top>-1 && pushV[top]==popV[top_out]){
top--;
top_out++;
}
}
return top==-1?true:false;
}
};