【面试】包含min函数的栈

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


这道题在《剑指Offer》中出现过(第21题),在很多公司的面试也频频出现。解决方案如下:

1,利用空间换时间:

      建立一个数据栈用于保存进栈的数据,建立一个辅助栈用于保存数据栈各个时期的最小数据。

2,进栈:往数据栈中push一个数据x,如果辅助栈为空或者其栈顶元素大于x,则将x压入辅助栈。(辅助栈栈顶始终保存数据栈的最小数据)

3,出栈:数据栈pop一个数据,辅助栈也pop一个数据

4,获取min函数:辅助栈的栈顶元素就是数据栈中的最小数据。

代码实现如下

package suanfa.datastruct;

import java.util.Stack;

public class StackWithMin {
	/*
	 * dataStack:数据栈
	 * assistStack:辅助栈
	 */
	private Stack<Integer> dataStack;
	private Stack<Integer> assistStack;
	/*
	 * 构造器
	 */
	public StackWithMin(){
		dataStack = new Stack<Integer>();
		assistStack = new Stack<Integer>();		
	}
	
	public void push(Integer value){
		dataStack.push(value);
		pushMin(value);
	}
	/*
	 * 往辅助栈中压入数据
	 * 若待压入数据x大于辅助栈的栈顶元素y,则压入y
	 * 若待压入数据x小于辅助栈的栈顶元素y,则压入x
	 */
	public void pushMin(Integer newValue){
		if(assistStack.empty()){
			assistStack.push(newValue);
			return;
		}
		Integer peekValue = assistStack.peek();
		if(newValue <= peekValue){
			assistStack.push(newValue);
		}else{
			assistStack.push(peekValue);
		}
	}
	/*
	 * 出栈:数据栈和辅助栈同时出栈。
	 */
	public void pop(){
		dataStack.pop();
		assistStack.pop();
	}
	/*
	 * 获取栈中最小元素
	 */
	public Integer getMin(){
		System.out.print("栈中最小元素为:");
		System.out.println(assistStack.pop());
		return assistStack.pop();
	}
	/*
	 * 输出栈中所有元素,输出顺序为栈低--->栈顶
	 */
	public void printStack(){
		System.out.println("输出栈中元素:");
		System.out.print("<<栈底");
		for (Integer value : dataStack){ 
			System.out.print(value + ","); 
        }
		System.out.println("栈顶>>");
	}
	
		
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StackWithMin stackWithMin = new StackWithMin();
		stackWithMin.push(5);
		stackWithMin.push(2);
		stackWithMin.push(3);
		stackWithMin.printStack();
		stackWithMin.getMin();
		stackWithMin.push(1);
		stackWithMin.push(4);
		stackWithMin.pop();
		stackWithMin.printStack();
		stackWithMin.getMin();
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值