题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
leetcode:155、最小栈
剑指offer:5、用两个栈实现队列 (其中包含如何用队列实现栈)
题目:用队列实现栈,并且包含min函数(下面有解答)
总结:
包含min函数的栈:重点就是用另一个栈来存储当前栈中所有元素的最小值,然后pop的时候都pop一位出来就可以了。
用栈实现队列;用队列实现栈:首先要搞清楚:栈后进先出,当栈stack使用push的时候是在尾部添加元素,删除时候是在尾部删除;队列先进先出,当队列queue使用push的时候是在尾部添加元素,而删除时候是在首部删除。
用队列实现栈,并且包含min函数:利用一个辅助队列来保存当前的最小值。因为这里涉及到两个队列,每个队列在插入的时候,都会插入到首部(因为要模拟栈),所以封装一个push_front函数。
在这类题目的时候,有几点要注意:
- 当栈(队列)调用q.front(),s.top()函数的时候,如果容器为空会产生此迭代器错误,所以只有写包含min函数的栈和队列的时候要注意,而实际上pop(),top()...这种操作都会引发迭代器错误。如果面试的时候要交流这种情况,自己没写出来但是已经考虑到了。
if(s.empty()){
s.push(val);
...
}
- 如果要保存当前栈最小值,插入的时候可以跟栈顶元素比较,如果栈顶元素小,就把栈顶元素赋值给val,合并成一句插入,看起来更简洁。
if (min_q.front() < val) {
val = min_q.front();
}
push_front(val, min_q);
包含min函数的栈
class Solution {
public:
void push(int value) {
stack1.push(value);
if(stack2.empty()){//如果直接调用stack2.top()可能会有迭代器错误
stack2.push(value);
}
else{
if(value > stack2.top()){
value = stack2.top();
}
stack2.push(value);
}
}
void pop() {
stack1.pop();
stack2.pop();
}
int top() {
return stack1.top();
}
int min() {
if(stack2.empty())
return 0;
else
return stack2.top();
}
private:
stack<int> stack1;
stack<int> stack2;
};
用队列实现栈,并且包含min函数
结果图:
class my_stack {
private:
queue<int> q;
queue<int> min_q;
public:
void pop() {
q.pop();
min_q.pop();
}
void push(int val) {
push_front(val, q);
if(min_q.empty())
push_front(val, min_q);
else {
if (min_q.front() < val) {
val = min_q.front();
}
push_front(val, min_q);
}
}
int top() {
return q.front();
}
int min() {
return min_q.front();
}
void push_front(int val,queue<int>& q) {
q.push(val);
for (int i = 0;i < q.size()-1; i++) { //新添加了一个元素,只用倒置n-1个
q.push(q.front());
q.pop();
}
}
};
void main(){
...
s.push(5);
s.push(-1);
s.push(2);
s.push(3);
s.push(1);
}