剑指offer面试题30:包含min函数的栈(Java实现)

题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push,及pop的时间复杂度都为O(1)。

直接上代码:

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<>();  //创建两个栈 Stack1作为主栈
	Stack<Integer> stack2 = new Stack<>();   //用辅栈来存放最小数据
    
    public void push(int node) {   
		stack1.push(node);   //主栈存放数据
		if (stack2.isEmpty()) { //如果辅栈为空,添加该数据。  
			stack2.push(node);    
		} else if (node < stack2.peek()) {
        //如果新添数据比辅栈最小值还要小,那么辅栈添加该数据
			stack2.push(node);
		}
	}

	public void pop() {  //在弹出的时候,如果当前弹出值为最小值,辅栈也进行pop。
		if(stack1.peek()==stack2.peek())
			stack2.pop();
		stack1.pop();
	}

	public int top() {
		return stack1.peek();  //top只是返回栈顶元素,不用进行增删操作。
	}

	public int min() {
		return stack2.peek();  //返回辅栈栈顶元素,栈顶存放的是最小元素。
	}
}

分析:

我们用一个辅栈Stack2来记录栈的最小值为多少,以添加{9,12,5,18,3}中途取出部分数据为例,具体操作如下:

这里使用栈顶工作模式是满递减模式。

1)我们添加数字9,主栈无论何时正常添加,辅栈因为是空栈,进行添加此时的栈最小元素是9

   

2)我们添加数字12,主栈照常添加,辅栈因为12>9,我们辅栈不进行添加(书上老师的做法是辅栈添加元素9,这里对老师的做法进行简单优化处理)

                        

3)添加元素5,主栈正常添加,辅栈添加元素5(5<9)

4)添加元素18,主栈照常添加,辅栈不进行任何操作(18>5)

5)如果我们此时要取出数据,例如用户进行pop操作,主栈pop返回数据18,因为此时(18!=5)因此,辅栈不进行任何操作;

if(stack1.peek()==stack2.peek())
			stack2.pop();
		stack1.pop();

6)此时再进行pop操作,主栈pop的数字是5,此时5是最小元素,因此辅栈也进行pop操作

剩下的我想就不用介绍了,希望可以帮助大家,如果大家发现问题,欢迎指出。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值