这道题看过了书的思路 还是没有写出来;之后看过了书上的代码后照着写了一遍:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
//输入序列的大小判断
if(pushV.size()==0 || popV.size()==0 || pushV.size()!=popV.size()){
return false;
}
bool result = false;
stack<int> tempStack;
int j=0; //遍历pushV序列的指针
for (int i=0; i<popV.size(); i++){
//辅助栈的入栈操作
while(tempStack.empty() || tempStack.top()!=popV[i]){
if(j == pushV.size()) break;
tempStack.push(pushV[j]);
j++;
}
//如果下一个要弹出的元素不在辅助栈的栈顶
if(tempStack.top()!=popV[i]) break;
//如果下一个要弹出的元素在辅助栈的栈顶
tempStack.pop();
if(tempStack.empty() && i==(pushV.size()-1)){
result = true;
}
}
return result;
}
};
讨论区比较牛逼的写法:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size() == 0) return false;
vector<int> stack;
for(int i = 0,j = 0 ;i < pushV.size();){
stack.push_back(pushV[i++]);
while(j < popV.size() && stack.back() == popV[j]){
stack.pop_back();
j++;
}
}
return stack.empty();
}
};
和一个思路比较清晰的Java程序:
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
if(pushA.length == 0 || popA.length == 0)
return false;
Stack<Integer> s = new Stack<Integer>();
//用于标识弹出序列的位置
int popIndex = 0;
for(int i = 0; i< pushA.length;i++){
s.push(pushA[i]);
//如果栈不为空,且栈顶元素等于弹出序列
while(!s.empty() &&s.peek() == popA[popIndex]){
//出栈
s.pop();
//弹出序列向后一位
popIndex++;
}
}
return s.empty();
}
}
以上这两个程序,都是以辅助栈最后为空作为true/false的标准的:因为程序中会把pushV序列所有的元素断断续续都压进辅助栈中,如果能顺利pop到空而不是中途break or 还没有pop空就退出了循环,就表明是true。