算法题014 -- [Min Stack] by java

题目

设计一个支持push、pop、top和能返回最小值stack中最小值的stack

举例

MinStack minStack = new MinStack(); 
minStack.push(-2); 
minStack.push(0); 
minStack.push(-3); 
minStack.getMin(); –> Returns -3. 
minStack.pop(); 
minStack.top(); –> Returns 0. 
minStack.getMin(); –> Returns -2.

分析

考察的完全是代码功底…
这里我分别是用数组和类链表的数据结构来实现。

代码

package algorithm014;

import java.util.Arrays;

public class Algorithm014 {
	
	public static void main(String[] args) {
//		testCode(); //测试代码在最下面
	}
}

interface IMinStack<E>{
	E push(E item);
	E pop();
	E top();
	E getMin();
}

abstract class AbsMinStack<E> implements IMinStack<E>{
	
	int realElementCout;
	
	E top;
	
	E min;

	@Override
	public E top() {
		return top;
	}

	@Override
	public E getMin() {
		return min;
	}
	
	public int size() {
		return realElementCout;
	}
}

/**
 * 数组实现,主要在于 arr 的扩容
 * @author looper
 *
 */
class ArrayMinStack extends AbsMinStack<Integer>{
	
	private static final int DEFAULT_SIZE = 8;
	
	private Integer[] arr = new Integer[DEFAULT_SIZE];

	@Override
	public Integer push(Integer item) {
		if(item != null) {
			realElementCout++;
			if(realElementCout > arr.length) 
				arr = Arrays.copyOf(arr, arr.length + DEFAULT_SIZE);
			arr[realElementCout-1] = item;
			top = item;
			if(min == null)
				min = item;
			else if(min > item) {
				min = item;
			}
		}
		return item;
	}

	@Override
	public Integer pop() {
		if(realElementCout >=1) {
			realElementCout--;
			if(realElementCout <= 0)
				top = null;
			else
				top = arr[realElementCout-1];
			return arr[realElementCout];
		}else {
			top = null;
			return null;
		}
	}
	
}

/**
 * 链表实现,主要在于 变量的切换赋值
 * @author looper
 *
 */
class LinkedMinStack extends AbsMinStack<Integer>{
	
	ListNode preNode = null;
	ListNode tailNode = null;

	@Override
	public Integer push(Integer item) {
		if(item != null) {
			realElementCout++;
			top = item;
			if(min == null) {
				min = item;
			}else if(min > item) {
				min = item;
			}
			preNode = tailNode;
			tailNode = new ListNode(item);
			tailNode.pre = preNode;
		}
		return item;
	}

	@Override
	public Integer pop() {
		if(tailNode == null) {
			return null;
		}
		int pop = tailNode.content;
		tailNode = preNode;
		if(tailNode != null) {
			top = tailNode.content;
		}else
			top = null;
		if(preNode != null)
			preNode = preNode.pre;
		return pop;
	}
	
	class ListNode{
		Integer content;
		ListNode pre;
		
		public ListNode() {}
		
		public ListNode(Integer content) {
			this.content = content;
		}
	}

} 
//private static void testCode() {
//	Integer top;
//	Integer min;
//	AbsMinStack<Integer> arrayMinStack = new ArrayMinStack();
//	min = arrayMinStack.getMin();
//	top = arrayMinStack.top();
//	System.out.println(top +"");
//	System.out.println(min+"");
//	arrayMinStack.push(0);
//	arrayMinStack.push(-2);
//	arrayMinStack.push(3);
//	arrayMinStack.push(1);
//	min = arrayMinStack.getMin();
//	top = arrayMinStack.top();
//	System.out.println(top +"");
//	System.out.println(min+"");
//	System.out.println(arrayMinStack.pop() +"");
//	System.out.println(arrayMinStack.pop() +"");
//	System.out.println(arrayMinStack.pop() +"");
//	System.out.println(arrayMinStack.pop() +"");
//	System.out.println(arrayMinStack.pop() +"");
//	arrayMinStack.push(5);
//	System.out.println(arrayMinStack.pop() +"");
//	System.out.println("===");
//	AbsMinStack<Integer> linkedMinStack = new LinkedMinStack();
//	min = linkedMinStack.getMin();
//	top = linkedMinStack.top();
//	System.out.println(top +"");
//	System.out.println(min+"");
//	linkedMinStack.push(0);
//	linkedMinStack.push(-1);
//	linkedMinStack.push(3);
//	linkedMinStack.push(-12);
//	linkedMinStack.push(30);
//	linkedMinStack.push(5);
//	min = linkedMinStack.getMin();
//	top = linkedMinStack.top();
//	System.out.println(top +"");
//	System.out.println(min+"");
//	System.out.println(linkedMinStack.pop() +"");
//	System.out.println(linkedMinStack.pop() +"");
//	System.out.println(linkedMinStack.pop() +"");
//	System.out.println(linkedMinStack.pop() +"");
//	System.out.println(linkedMinStack.pop() +"");
//	System.out.println(linkedMinStack.pop() +"");
//	System.out.println(linkedMinStack.pop() +"");
//	linkedMinStack.push(5);
//	System.out.println(linkedMinStack.pop() +"");
//}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值