剑指 Offer 30. 包含min函数的栈
个人思路
题意
根据题目要求,
- 既要能在O(1)内拿到最小元素,需要用一个数据结构辅助存储最小元素集合,包括次小元素
- 又要能在O(1)内拿到栈顶元素,需要用栈存储
思路
栈+双端队列
- 栈正常存储,进行出栈,入栈,访问栈顶元素
- 双端队列,每次用队首元素和入队元素进行比较,将最小元素存储在队首;
- 当栈顶元素出栈时,栈顶元素的位置一定是在队列的队首或队尾,在队列中找到栈顶元素出队即可
栈+辅助栈
- 栈正常存储,进行出栈,入栈,访问栈顶元素
- 辅助栈,每次用栈顶元素和当前元素进行比较,将较小的元素入栈,以保证每次可以访问到最小元素,并保存次小元素
- 当栈顶元素出栈时,判断出栈元素是否和辅助栈栈顶元素相同,相同则一起出栈
个人思路代码
栈+双端队列
class MinStack {
public:
/** initialize your data structure here. */
deque<int> q;//辅助保存最小元素
stack<int> s;//原始栈
MinStack() {
}
//栈中正常存储,队列中将最小值放在前面
void push(int x) {
if(q.empty()){
q.push_back(x);
}
else{
if(x <= q.front()){
q.push_front(x);
}else{
q.push_back(x);
}
}
s.push(x);
}
//栈正常出栈,且栈顶元素一定在队列的队首或队尾,找到并出队
void pop() {
int top = s.top();
s.pop();
if(q.front() == top){
q.pop_front();
}
else if(q.back() == top){
q.pop_back();
}
}
int top() {
int res = s.top();
return res;
}
int min() {
int res = q.front();
return res;
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->min();
*/
栈+辅助栈
class MinStack {
public:
/** initialize your data structure here. */
stack<int> s1;//原始栈
stack<int> s2;//辅助栈
MinStack() {
}
void push(int x) {
s1.push(x);
if(s2.empty()){
s2.push(x);
}else{
if(x <= s2.top()){
s2.push(x);
}
}
}
void pop() {
int top = s1.top();
s1.pop();
if(top == s2.top()){
s2.pop();
}
}
int top() {
int res = s1.top();
return res;
}
int min() {
int res = s2.top();
return res;
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->min();
*/