MinStack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • getMin() -- Retrieve the minimum element in the stack.

题目的意思是实现一个栈,能够实现推入,推出,返回顶端元素,获得最小元素的功能

public class MinClass {

	private Stack<Integer> a = new Stack<Integer>() ;
	private Stack<Integer> minStack = new Stack<Integer>(); 

    public void push(int x) {
    	/**
    	 * 判断最小栈,如果栈为空或者压入的栈值小于栈顶元素,将x压入最小栈
    	 */
    	if(minStack.isEmpty() || x<minStack.peek()){
    		minStack.push(x);
    	}
    	a.push(x);

    }
    public void pop() {
    	/**
    	 * 如果不相等,会把minStack中保存的最小值给推出。所以必须保证minStack中推出
    	 * 的值必须和a中的值一样
    	 */
    	if(minStack.peek().equals(a.peek())){
    		minStack.pop();
    	}
    	a.pop();
    }

    public int top() {
    	return a.peek();
    }

    public int getMin() {
    	return minStack.peek();
    }

    /**
     * 测试
     */
    public static void main(){
    	MinClass obj = new MinClass();
    	obj.push(10);
    	obj.push(20);
    	obj.pop();
    	obj.push(30);
    	System.out.println(obj.getMin());
    }
}

  

拓  展



图片来自于维基

堆栈(英语:stack),也可直接称栈 由于堆栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈空间有操作系统自动分配,使用完成后有编译器自动释放,通常用来存放函数的参数值、局部变量的值等。

栈使用的是靠近ALU的一级缓存,他们通常是在调用时处于存储空间中,调用完毕后就会立即释放。与“堆(Heap)"不同,堆内存有程序员释放那个,存放于二级缓存中,结构类似于链表,程序员分配时内存变量的值不一定是连续的,因此,堆处理的速度相比与栈来说速度要慢一些!

(截图来自 计算机系统概论)

如图所示,a)有5个连续的存储空间,每个存储单元为1个字节(这也是目前操作系统内存结构的排列方式,类似于一个大的字节数组)。R6代表栈顶寄存器,用来存储栈顶元素的指针。b)当往栈中push一个元素18以后,栈顶元素指针加1,其他地址不变。c)往栈中压入3个元素后的结果,可以看到不断修改栈顶指针的大小。d)弹出2个元素的结果

下面我们用Java代码实现栈,前文已经说明,实现栈的方式可以有数组,也可以有链表来实现(因为这两个数据结构都是线性结构)

Java的SDK中封装好的有一个Stack,他的常用方法有

empty()

Tests if this stack is empty

peek()

Looks at the object at the top of this stack without removing it from the stack.

pop()

Removes the object at the top of this stack and returns that object as the value of this function.

push(E item)

Pushes an item onto the top of this stack.

栈的数组实现:

/**
 * 栈的数组实现方式
 * @author CYW
 */
public class ArrayStack {
	private long[] stackArray;//数组
	private int stackSize;//记录存储记录的最大的条数
	private int top = -1;//记录栈顶位置

	// 记录分配存储空间的大小
	public ArrayStack(int s){
		stackArray = new long[s];
		top  = -1;
		stackSize = s;
	}

	public long pop(){
		return stackArray[top--];
	}

	public void push(int x){
		stackArray[++top] = x;
	}

	public long peek(){
		return stackArray[top];
	}

	public boolean isEmpty(){
		return (stackArray.length == 0);
	}

	// 测试
	public static void main(){
		ArrayStack obj = new ArrayStack(100);
		obj.push(100);
		obj.push(20);
		obj.push(10);
		obj.push(200);
		obj.push(1000);
		obj.pop();
		/**
		 *
		 */
		for (int i = 0;i<obj.top;i++){
			System.out.println(obj.stackArray[i]);
		}
	}
}

 需要注意的一点是:我们在输出数组元素的时候不能根据数组的长度来判断,而必须根据站顶的top来判断!

时间: 2024-10-08 20:11:03

MinStack的相关文章

LintCode MinStack

Implement a stack with min() function, which will return the smallest number in the stack. It should support push, pop and min operation all in O(1) cost. Example push(1) pop() // return 1 push(2) push(3) min() // return 2 push(1) min() // return 1 1

【leetcode】3 minstack

构建MinStack,实现一系列操作,包括push,pop,top,minstack(返回栈中最小元素) 思路:利用原始栈,不过这里需要两个栈,一个栈mystack用于存储元素,另一个栈otherstack元素由小到大排列 关键:mystack进行push(x)时,判断x与mystack的top()元素大小,始终将小的元素如栈minstack,这样mystack的top()始终是最小的 mystack的pop操作也是类似,当mystack与otherstack的top元素相同时,两个元素同时删除

leetcode MinStack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the minimum e

LeetCode Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the minimum e

155. Min Stack 求栈的最小值

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the minimum e

算法总结

一 基础知识 1. 均为线性表,可以由数组或链表实现 栈:先进后出,操作均在栈顶进行 队列:先进先出,队尾进,队首出 2.  STL stack & queue stack 常见操作: s.push(x):入栈 (void类型) s.pop(): 出栈 (void类型,只删除,不返回元素) s.top(): 返回栈顶元素 s.size():返回栈元素个数 s.empty() :判断栈是否为空 queue 常见操作: q.push(x): 入队 q.pop(): 出队 (void类型,只删除,不返

算法之设计一个有getMin方法的栈结构

要求该栈的getMin方法和push和pop方法的时间复杂度都是O(1). 设计方案一: package coding.chapter01; import java.util.Stack; /** * Created by Needle on 2017/3/17. */ public class GetMinStack { private Stack<int> dataStack;//存储数据的栈 private Stack<int> minStack;//存储最小值的栈 publ

第八节 数据结构

1.栈和队列 队列:BFS 栈:DFS 例题: (1)min stack: 思路:使用两个栈实现.第二个栈对应相应层为栈顶的最小值. 更节省空间的方法是:相邻层如果值相同可用计数的机制来节省空间. 代码 : public class MinStack { Stack<Integer> s; Stack<Integer> minStack; public MinStack() { // do initialize if necessary s = new Stack<Integ

最小栈

思想分析: 实现方案: class MinStack { public: MinStack() {} void push(int x) { if (StackNum.empty()) { StackNum.push(x); StackMin.push(x); } else { if (x <= StackMin.top()) StackMin.push(x); StackNum.push(x); } } void pop() { if (StackMin.top() == StackNum.to