【算法】最小栈的实现(getMin)

看书时遇到这样一道题,挺有趣的数据结构,所以记录下来

题目:

实现一个栈,该栈带有出栈(pop),入栈(push),取最小元素(getMin),三个方法。要保证这3个方法的时间复杂度都是O(1)

算法:

1.定义两个栈,一个栈自定义栈用于入栈、出栈,一个辅助栈用于动态存放自定义栈的最小值

2.入栈操作,当元素压入 自定义栈 的时候,会判断辅助栈是否为空,
如果辅助栈为空,或者新元素小于等于辅助栈栈顶,则将新元素压入(push) 辅助栈

因为当第一个元素入栈时,这个唯一的元素也就是自定义栈当前最小的值,所以也压入(push) 辅助栈

3.出栈操作,如果出栈元素和辅助栈栈顶元素值相等,辅助栈出栈(pop)。

代码如下:

入栈操作

如果辅助栈为空,或者新元素小于等于辅助栈栈顶,则将新元素压入辅助栈


	/**
	 * 入栈操作
	 * @param element 入栈的元素	
	 */
	
	public void push(int element){
		mainStack.push(element);
		//如果辅助栈为空,或者新元素小于等于辅助栈栈顶,则将新元素压入辅助栈
		if(minStack.empty()|| element <= minStack.peek()){
			//empty() 表示的是测试堆栈是否为空。
			//peek() 表示的是查看堆栈顶部的对象,但不从堆栈中移除它。
			minStack.push(element);
		}
	}
出栈操作

如果出栈元素和辅助栈栈顶元素值相等,辅助栈出栈(pop)。


	/**
	 * 出栈操作
	 */
	public Integer pop(){
		//如果出栈元素和辅助栈栈顶元素值相等,辅助栈出栈
		if(mainStack.peek().equals(minStack.peek())){
			minStack.pop();
		}
		return mainStack.pop();
	}
获取栈的最小元素(getMin方法)
/**
	 * 获取栈的最小元素
	 */
	public int getMin() throws Exception{
		if(mainStack.empty()){
			throw new Exception ("stack is empty");
		}
		return minStack.peek();
	}	
主函数

元素入栈,输出最小值,元素出栈,再输出最小值

public static void main(String[] args) throws Exception {
		MinStack stack=new MinStack();
		stack.push(4);
		stack.push(9);
		stack.push(7);
		stack.push(3);
		stack.push(8);
		stack.push(5);
		System.out.println(stack.getMin());
		stack.pop();
		stack.pop();
		stack.pop();
		System.out.println(stack.getMin());

	}

运行结果:
3
4

完整代码
package min_ini;
import java.util.Stack;
public class MinStack {
	
	private Stack<Integer> mainStack=new Stack<Integer>();
	private Stack<Integer> minStack=new Stack<Integer>();
	
	/**
	 * 入栈操作
	 * @param element 入栈的元素	
	 */
	
	public void push(int element){
		mainStack.push(element);
		//如果辅助栈为空,或者新元素小于等于辅助栈栈顶,则将新元素压入辅助栈
		if(minStack.empty()|| element <= minStack.peek()){
			//empty() 表示的是测试堆栈是否为空。
			//peek() 表示的是查看堆栈顶部的对象,但不从堆栈中移除它。
			minStack.push(element);
		}
	}
	
	/**
	 * 出栈操作
	 */
	public Integer pop(){
		//如果出栈元素和辅助栈栈顶元素值相等,辅助栈出栈
		if(mainStack.peek().equals(minStack.peek())){
			minStack.pop();
		}
		return mainStack.pop();
	}
	/**
	 * 获取栈的最小元素
	 */
	public int getMin() throws Exception{
		if(mainStack.empty()){
			throw new Exception ("stack is empty");
		}
		return minStack.peek();
	}	
	
	public static void main(String[] args) throws Exception {
		MinStack stack=new MinStack();
		stack.push(4);
		stack.push(9);
		stack.push(7);
		stack.push(3);
		stack.push(8);
		stack.push(5);
		System.out.println(stack.getMin());
		stack.pop();
		stack.pop();
		stack.pop();
		System.out.println(stack.getMin());

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值