剑指offer系列18---顺时针打印矩阵

本文介绍了一种特殊的栈数据结构,在该结构中实现了获取栈内最小元素的min函数,时间复杂度为O(1)。通过使用辅助栈来保持栈顶始终是最小值的方式,确保了在进行push和pop操作时能同时维护这个性质。

【题目】定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求时间复杂度是O(1)。push pop min

【思路】设计一个辅助栈,当新加入的原数据栈中的数小于辅助栈顶的数时就加入该数,大于就继续加入辅助栈顶的数。这样想取出最小数就直接取出辅助栈栈顶的数就可以。

     

 1 package com.exe4.offer;
 2 
 3 import java.util.Stack;
 4 
 5 /**
 6  * 18【题目】定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求时间复杂度是O(1)。
 7  * @author WGS
 8  *
 9  */
10 public class MinInStack {
11     
12     Stack<Integer> dataStack=new Stack<Integer>();//数据栈
13     Stack<Integer> assisstStack=new Stack<Integer>();//辅助栈
14     
15     //压入操作 保证最小的数放在栈顶,所以原数据栈压入一个数时,辅助栈要比较该数与上个数的大小,》则仍压入上个数
16                                                            //小,则压入该数
17     public void push(int node){
18         dataStack.push(node);
19         if(assisstStack.size()==0 || node<assisstStack.peek()){//新压入的数node小,就压入node
20             assisstStack.push(node);
21         }else{
22             assisstStack.push(assisstStack.peek());//否则压入assisstStack中最小的数
23         }
24     }
25     
26     public void pop(){
27         if(dataStack.size()>0 && assisstStack.size()>0){
28             dataStack.pop();
29             assisstStack.pop();
30         }
31     }
32     //元数据栈顶值
33     public int top(){
34         if(dataStack.size()>0){
35             return dataStack.peek();
36         }
37         return -1;
38     }
39     //辅助栈中最小值
40     public int min(){
41         if(dataStack.size()>0 && assisstStack.size()>0){
42             return assisstStack.peek();
43         }
44         return -1;
45         
46     }
47     public static void main(String[] args) {
48         MinInStack minStack=new MinInStack();
49         minStack.push(1);
50         //minStack.pop();
51         minStack.push(4);
52         minStack.push(2);
53         minStack.push(11);
54         
55         System.out.println(minStack.min());//1   辅助栈中最小值
56         System.out.println(minStack.top());//11 元数据栈中栈顶值
57 
58     }
59 
60 }

 

转载于:https://www.cnblogs.com/noaman/p/5440758.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值