剑指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函数的栈的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer包含min函数的栈python

包含min函数的栈-剑指Offer

剑指offer(20)包含min函数的栈

剑指Offer30包含min函数的栈

LeetCode(剑指 Offer)- 30. 包含min函数的栈

剑指offer:面试题21包含min函数的栈