码迷,mamicode.com
首页 > 其他好文 > 详细

设计一个有getMin功能的栈

时间:2018-09-02 18:49:08      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:data   vat   imp   package   出现   exce   image   特殊   基础   

【题目】

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

【要求】?

            1.pop、push、getM?in()操作的时间复杂度都是O(1)。

            2.设计的栈类型可以使用现成的栈结构。?

【解答】?

            在设计上我们使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,这个栈记为stackData;另一个栈用于保存每一步的最小值,这个栈记为stackMin。?

压人规则:?

假设当前数据为newNum,先将其压入stackData。然后判断stackMin是否为空:?

        如果为空,则newNum也压入stackMin。?

?        如果不为空,则比较newNum和stackMin的栈顶元素哪一个更小:

        如果newNum更小或两者相等,newNum也压入stackMin;?

      ?  如果stackMin中栈顶元素小,则stackMin不压入任何内容。

弹出规则:?

        ?先在stackData中弹出栈顶元素,记为value。然后比较当前stackMin的栈顶元素和value值哪一个更小。通过压入规则可知,stackMin中存在的元素是从栈底到栈顶逐渐变小的,stack栈顶的元素既是stackMin栈的最小值,也是当前stackData栈的最小值。所以不会出现value比stackMin栈顶元素更小的情况,value只可能大于或者等于stackMin的栈顶元素。

        当value等于stackMin的栈顶元素时,stackMin弹出栈顶元素;当value大于stackMin的栈顶元素时,stackMin不弹出栈顶元素,返回value。

查询当前栈中的最小值操作?

       stackMin始终记录着stackData中的最小值,所以,stackMin的栈顶元素始终是当前stackData中的最小值。?

MyStack1.java:

 1 package cn.hl.p1;
 2 
 3 import java.util.Stack;
 4 import org.junit.Test;
 5 
 6 /**
 7  * 设计一个有getMin功能的栈
 8  * 题目:设计一个特殊的栈。在实现栈的基础功能上,再实现返回栈中最小元素的操作
 9  * 要求:
10  * (1)pop,push,getMin操作的时间复杂度为O(1)
11  * (2)设计的栈类型可以使用现成的栈结构
12  * 
13  * @author 猩生柯北
14  */
15 
16 public class MyStack1 {
17     private Stack<Integer> stackData;
18     private Stack<Integer> stackMin;
19     
20     public MyStack1(){
21         this.stackData = new Stack<Integer>();
22         this.stackMin = new Stack<Integer>();
23     }
24     
25     public void push(int newNum){
26         if(this.stackMin.isEmpty()){
27             this.stackMin.push(newNum);
28         }else if(newNum <= this.getmin()){
29             this.stackMin.push(newNum);
30         }
31         this.stackData.push(newNum);
32     }
33     
34     public int pop(){
35         if(this.stackData.isEmpty()){
36             throw new RuntimeException("you stack is empty");
37         }
38         int value = this.stackData.pop();
39         if(value == this.getmin()){
40             this.stackMin.pop();
41         }
42         return value;
43     }
44 
45     public int getmin() {
46         if(this.stackMin.isEmpty()){
47             throw new RuntimeException("you stack is empty");
48         }
49         return this.stackMin.peek();
50     } 
51 }

Test.java:

技术分享图片

 

设计一个有getMin功能的栈

标签:data   vat   imp   package   出现   exce   image   特殊   基础   

原文地址:https://www.cnblogs.com/zhzcode/p/9574343.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!