剑指offer--包含min函数的栈
Posted imbystander
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer--包含min函数的栈相关的知识,希望对你有一定的参考价值。
题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
- 求解思路1:设置两个栈结构,一个数据栈(dataStack)用来存放数据元素,另一个最小栈(minStack)来记录数据栈中最小的元素。每当有元素要进栈时先把进栈元素与栈中最小元素(即minStack得栈顶元素)比较,如果进栈元素更小,则把元素压入dataStack和minStack中,否则把要进栈的元素压入dataStack中,minStack压入minStack的栈顶元素。
class Solution {
public:
void push(int value) { //进栈
if(dataStack.empty()){
dataStack.push(value);
minStack.push(value);
}else{
if(value<minStack.top()){
minStack.push(value);
}else{
minStack.push(minStack.top());
}
dataStack.push(value);
}
}
void pop() { //出栈
dataStack.pop();
minStack.pop();
}
int top() { //取栈顶元素
return dataStack.top();
}
int min() { //得到栈中最小的元素
return minStack.top();
}
private:
stack<int> dataStack; //数据栈
stack<int> minStack; //最小值栈,当数据栈改变(数据进栈或出栈)时记录最小的元素
};
- 求解思路2:用一个变量min来记录当前栈中最小的元素。当有元素进栈时,先把要进栈的元素与min比较,如果要进栈的元素更小或相等,则先把min压栈,再把进栈元素压栈,同时更新min变量为进栈元素的值;当有元素要出栈时,如果出栈的元素与min值相等,则先推出栈顶元素,在把栈顶元素赋值给min,在退出栈顶元素(这个时候推出的栈顶元素时保存在栈中的最小的元素值)。
class Solution {
public:
void push(int value) {
if(min>=value){
if(!dataAndMinStack.empty()) dataAndMinStack.push(min);
min = value;
}
dataAndMinStack.push(value);
}
void pop() {
if(dataAndMinStack.empty) return ;
if(dataAndMinStack.size()==1){
min = INT_MAX;
}else if(min == dataAndMinStack.top()){
dataAndMinStack.pop();
min = stack.top();
}
dataAndMinStack.pop();
}
int top() {
return dataAndMinStack.top();
}
int min() {
return min;
}
private:
stack<int> dataAndMinStack;
int static min = INT_MAX;
};
以上是关于剑指offer--包含min函数的栈的主要内容,如果未能解决你的问题,请参考以下文章