java栈最小值的实现_最小栈的实现_Stack_java实现

题目:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法。要保证这三个方法的时间复杂度都是O(1)。

Java 方法1

解法:

1.设原有的栈叫做栈A,此时创建一个额外的栈B,用于辅助原栈A。

2.当第一个元素进入栈A的时候,让新元素的下标进入栈B。这个唯一的元素是栈A的当前最小值。(考虑到栈中元素可能不是类对象,所以B栈存储的是A栈元素的下标)

3.每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素的下标进入栈B,此时栈B的栈顶元素就是栈A当前最小值的下标。

4.每当栈A有元素出栈时,如果出栈元素是栈A当前最小值,则让栈B的栈顶元素也出栈。此时栈B余下的栈顶元素所指向的,是栈A当中原本第二小的元素,代替刚才的出栈元素成为了栈A的当前最小值。(备胎转正)

5.当调用getMin方法的时候,直接返回栈B的栈顶所指向的栈A对应元素即可。

import java.util.Stack;

/**继承Stack*/

public class StackWithMin extends Stack {

//声明一个额外的最小栈  存放最小值

Stack extraStack;

public StackWithMin() {

//创建一个额外的最小栈

extraStack = new Stack();

}

//入栈(push)

public void push(int value) {

if (value < getMin()) {

extraStack.push(value);

}

super.push(value);

}

//出栈(pop)

public Integer pop() {

int value = super.pop();

if (value == getMin()) {

extraStack.pop();

}

return value;

}

//取最小元素(getMin)

public int getMin() {

if (extraStack.isEmpty()) {

return Integer.MAX_VALUE;

} else {

return extraStack.peek();

}

}

}

Java 方法2

import java.util.Stack;

/**自定义一个带有当前最小元素的节点类*/

class NodeWithMin {

private int value;

private int min;

public NodeWithMin(int value, int min) {

this.value = value;

this.min = min;

}

public int getMin()

{

return min;

}

public int getValue()

{

return value;

}

}

/**继承Stack*/

public class StackWithMin extends Stack {

//入栈

public void push(int value) {

int newMin = Math.min(value, getMin());

super.push(new NodeWithMin(value, newMin));

}

//取最小元素

public int getMin() {

if (this.isEmpty()) {

return Integer.MAX_VALUE;

} else {

return peek().getMin();

}

}

}

Java 方法3

/**自定义带有当前最小元素的链表*/

class Node{

int value;

int min;//进去的所有最小值  当前最小元素

Node next;

public Node(int value, int min){

this.value = value;

this.min = min;

}

}

/**自定义用户栈*/

public class MinStack

{

//头节点

private Node top;

public MinStack(){  }

//入栈(push)

public void push(int value){

if (top == null){

top = new Node(value, value);

}

else{

Node e = new Node(value, Math.min(value, top.min));

e.next = top;

top = e;

}

}

//出栈(pop)

public int pop() throws Exception {

if (top == null){

throw new Exception("Stack is empty");

}

int result = top.value;

Node temp = top.next;

top.next = null;

top = temp;

return result;

}

//取最小元素(getMin)

public int getMin(){

return top.min;

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值