【栈和队列】设计一个有getMin功能的栈

问题描述

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

要求:
1、pop、push、getMin操作的时间复杂度都是O(1)
2、设计的栈类型可以输用现成的栈结构

实现思路

思路大概就是用两个栈,一个栈用于自定义栈的弹出,压入,辅助栈用于存放最小值,当压入第一个栈的时候,会判断辅助栈是否为空,如果为空也压入,如果不为空,就比较,如果小于等于辅助栈的第一个值,就压入。弹出操作,如果第一个栈弹出的数和辅助栈的第一个数相等,也弹出辅助栈的第一个数,getMin()获取辅助栈的顶部的数据就好。

代码实现

import java.util.Stack;

public class Code_GetMinStack{
	public static class GetMinStack{
		private Stack<Integer> stackData;
		private Stack<Integer> stackMin;
		
		public GetMinStack() {
			stackData = new Stack<Integer>();
			stackMin  = new Stack<Integer>();
		}
		
		public void push(Integer obj) {
			stackData.push(obj);
			if(stackMin.isEmpty()) {
				stackMin.push(obj);
			}else {
				if(obj >= stackMin.peek()) {
					stackMin.push(stackMin.peek());
				}else {
					stackMin.push(obj);
				}
			}
		}
		
		public Integer pop() {
			if(stackData.isEmpty()) {
				throw new RuntimeException("stack is empty");
			}
			stackData.pop();
			return stackMin.pop();
		}
		
		public Integer getMin() {
			if(stackData.isEmpty()) {
				throw new RuntimeException("stack is empty");
			}
			return stackMin.peek();
		}
	}
	
	public static void main(String[] args) {
		GetMinStack getMinStack = new GetMinStack();
		getMinStack.push(10);
		System.out.println(getMinStack.getMin());	
		getMinStack.push(9);
		System.out.println(getMinStack.getMin());	
		getMinStack.push(8);
		System.out.println(getMinStack.getMin());	
		getMinStack.push(7);
		System.out.println(getMinStack.getMin());	
		getMinStack.push(6);
		System.out.println(getMinStack.getMin());
		getMinStack.push(5);
		System.out.println(getMinStack.getMin());
		getMinStack.pop();
		System.out.println(getMinStack.getMin());
		getMinStack.pop();
		System.out.println(getMinStack.getMin());
	}
}

你可能感兴趣的:(Algorithm)