LeetCode 剑指 Offer 31. 栈的压入、弹出序列 | C语言版
LeetCode 剑指 Offer 31. 栈的压入、弹出序列
题目描述
题目地址:剑指 Offer 31. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
解题思路
思路一:使用栈
代码实现
C++版本
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
//辅助栈help
stack<int> help;
//入栈序列pushed[i],出栈序列poped[pos]
int pushedSize=pushed.size();
int poppedSize=popped.size();
int i=0,pos=0;
for(i;i<pushedSize;++i){
//将序列pushed按顺序进栈(辅助栈help)
help.push(pushed[i]);
//如果此时进栈的数(栈顶元素help.top)等于poped中的数
while(pos<poppedSize && !help.empty() && help.top()==popped[pos]){
//将此时进栈的数(栈顶元素)出栈
help.pop();
pos++;
}
}
return help.empty();
}
};
C版本(未运行通过)
bool validateStackSequences(int* pushed, int pushedSize, int* popped, int poppedSize){
//辅助栈help
//stack<int> help=(stack<int>)malloc(sizeof(stack));//给栈分配内存空间
stack<int> help;
//入栈序列pushed[i],出栈序列poped[pos]
int pushedSize=pushed.size();
int poppedSize=popped.size();
int i=0,pos=0;
for(i;i<pushedSize;++i){
//将序列pushed按顺序进栈(辅助栈help)
help.push(pushed[i]);
//如果此时进栈的数(栈顶元素help.top)等于poped中的数
while(pos<poppedSize && !help.empty() && help.top()==popped[pos]){
//将此时进栈的数(栈顶元素)出栈
help.pop();
pos++;
}
}
return help.empty();
}
java版本
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
//辅助栈help
Stack<Integer> help = new Stack<>();
//入栈序列pushed[i],出栈序列poped[pos]
int pushedSize=pushed.length;
int poppedSize=popped.length;
int i=0,pos=0;
for(;i<pushedSize;++i){
//将序列pushed按顺序进栈(辅助栈help)
help.push(pushed[i]);
//如果此时进栈的数(栈顶元素help.top)等于poped中的数
while(pos<poppedSize && !help.empty() && help.peek()==popped[pos]){
//将此时进栈的数(栈顶元素)出栈
help.pop();
pos++;
}
}
return help.empty();
}
}
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
在这里插入代码片