栈的压入、弹出序列:最直观的想法是,使用辅助栈。首先遍历入栈,并将当前入栈元素压入辅助栈,再判断是否辅助栈不为空并且辅助栈栈顶元素等于当前出栈元素,注意这里是while循环,如果是则弹出辅助栈栈顶元素并且将当前出栈元素右移,最后判断辅助栈是否为空,如果是则压入弹出序列匹配,反之则不匹配。
bool IsPopOrder(vector<int> pushV,vector<int> popV)
{
stack<int> st; //辅助栈
int n=pushV.size(); //栈的大小
int j=0; //遍历出栈
for(int i=0;i<n;i++) //遍历入栈
{
st.push(pushV[i]); //压入元素
while(!st.empty()&&st.top()==popV[j])
//当辅助栈栈不为空并且辅助栈栈顶等于当前出栈元素
{
st.pop(); //弹出元素
j++; //辅助栈移位
}
}
return st.empty(); //如果栈为空则可以否则不行
}
优化:上述代码使用了辅助栈即使用了额外的辅助空间,那么可不可以将空间复杂度降为O(1)呢?当然可以!直接将入栈当作辅助栈!
bool IsPopOrder(vector<int> pushV,vector<int> popV)
{
int i=0,j=0; //i表示入栈作为辅助栈 j表示出栈
int n=pushV.size(); //栈的大小
for(int k=0;k<n;k++) //遍历入栈
{
pushV[i]=pushV[k]; //入栈压入辅助栈
while(i>=0&&pushV[i]==popV[j]) //辅助栈不为空且当前辅助栈栈顶等于当前出栈元素
{
i=i-1; //出栈
j=j+1; //下一个出栈元素
}
//i变成-1然后退出循环又加1变成0
i=i+1; //否则继续压入辅助栈
}
return i==0; //直至减为0
}



京公网安备 11010502036488号