[TOC]
一、设计最小栈
剑指 Offer 30. 包含min函数的栈(中等函数)
155. 最小栈(简单难度)
面试题 03.02. 栈的最小值(简单难度)
class MinStack {
public:
stack<int> stack1;//正常栈,实现栈的正常功能
stack<int> stack2;//辅助栈,负责实现min函数,入栈时只入比自己栈顶元素小的元素,出栈时和当前元素相等就出栈
MinStack() {}
// 入栈
void push(int val) {
stack1.push(val);//正常入栈
// 如果辅助栈为空或者辅助栈栈顶元素比较大,就入栈
if(stack2.empty()||stack2.top()>=val)stack2.push(val);
}
// 出栈
void pop() {
int top=stack1.top();
stack1.pop();// 正常出栈
// 如果出栈的元素和辅助栈栈顶元素相等
if(top==stack2.top()) stack2.pop();
}
// 获取栈顶元素
int top() {
return stack1.top();//正常的栈顶元素
}
// 获取最小值
int getMin() {
return stack2.top();//辅助栈的栈顶元素
}
};
二、验证栈序列
剑指 Offer 31. 栈的压入、弹出序列
946. 验证栈序列(中等难度)
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> stk;
int i=0;
for(int x:pushed){
stk.push(x);
// 循环检查,如果栈顶元素和出栈队列元素相同就出栈
// 栈内元素用完就继续加
while(!stk.empty()&&stk.top()==popped[i]){
stk.pop();
i++;
}
}
return stk.empty();
}
};