博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现O(1)获取最大最小值的栈----java
阅读量:6372 次
发布时间:2019-06-23

本文共 1482 字,大约阅读时间需要 4 分钟。

原文:http://blog.csdn.net/sheepmu/article/details/38459165

实现O(1)获取最大最小值的栈和队列----java

一.如何实现包含获取最小值函数的栈

 

问题:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的getMin函数。在该栈中,调用getMin、push及pop的时间复杂度都是O(1).

最小值思路:用一个辅助栈stack2记住每次入栈stack1的当前最小值:在stack1入栈时,往stack2中加入当前最小值;stack1元素出栈时,stack2也出栈一个元素。最小值从stack2中获取及栈顶元素。O(1)

最大值思路:同上O(1)

中间值思路:对栈排序,取中间值,但是时间不是O(1)

 

[java] 
 
  1. package com.sheepmu;  
  2.   
  3. import java.util.Arrays;  
  4. import java.util.Stack;  
  5.   
  6. public class SpecialStack<E extends Comparable<E>>  
  7. {  
  8.     Stack<E> stack1=new Stack<E>();  
  9.     Stack<E> stackMin=new Stack<E>();//存放求最小值的栈  
  10.     Stack<E> stackMax=new Stack<E>();//存放求最大值的栈  
  11.     public void push(E e)  
  12.     {  
  13.         stack1.push(e);   
  14.           
  15.         if(stackMin.isEmpty()||e.compareTo(stackMin.peek())<0)  
  16.             stackMin.push(e);//若最小栈为空push进stack时就同时把它push进stackMin;  
  17.         else if(e.compareTo(stackMin.peek())>0)  
  18.             stackMin.push(stackMin.peek());  
  19.           
  20.         if(stackMax.isEmpty()||e.compareTo(stackMin.peek())>0)  
  21.             stackMax.push(e);  
  22.         else if(e.compareTo(stackMax.peek())<0)  
  23.             stackMin.push(stackMax.peek());  
  24.     }  
  25.     public E pop()//一定要记着,非空才能pop()  
  26.     {  
  27.         if(!stack1.isEmpty()&&!stackMin.isEmpty()&&!stackMax.isEmpty())  
  28.         {     
  29.             E e=stack1.pop();  
  30.             stackMin.pop();  
  31.             stackMax.pop();  
  32.             return e;  
  33.         }  
  34.         else  
  35.         {  
  36.             System.out.println("栈已经为空了");  
  37.             return null;  
  38.         }  
  39.            
  40.     }  
  41.     public E getMin()  
  42.     {  
  43.         return  stackMin.peek();  
  44.     }  
  45.     public E getMax()  
  46.     {  
  47.         return stackMax.peek();  
  48.     }  
  49.     public E getMed()  
  50.     {  
  51.         E[] ss=stack1.toArray(new E[stack.size()]);//stack1.toArray()返回的是Object[],  栈----->数组;不能toArray后再强制转换,会报错  
  52.         Arrays.sort(ss);  
  53.         return ss[ss.length/2];  
  54.     }  
  55.       
  56. }  

转载于:https://www.cnblogs.com/zhizhan/p/4882971.html

你可能感兴趣的文章
WEEX-EROS | 集成并使用 bindingx
查看>>
广州牵引力来告诉你学编程先学什么语言好?
查看>>
广州牵引力总结初学者怎样学好UI设计?
查看>>
使用Metrics方法级远程监控Java程序
查看>>
Spring核心系列之Bean的生命周期
查看>>
VasSonic源码之并行加载
查看>>
小程序 LRU 存储设计
查看>>
Android 多线程之阻塞队列
查看>>
Haskell 在 macOS 下的环境搭建
查看>>
适配mpvue平台的的微信小程序日历组件mpvue-calendar
查看>>
【Linux学习】 Redis常用的一些指令
查看>>
Spring Cloud 中使用Feign解决参数注解无法继承的问题
查看>>
数据迁移方案 + Elasticsearch在综合搜索列表实现
查看>>
干货 | 分分钟教你用Python创建一个区块链
查看>>
Angular开发实践(八): 使用ng-content进行组件内容投射
查看>>
canvas+websocket+vue做一个完整的你画我猜小游戏
查看>>
android复习清单
查看>>
工作代码备用
查看>>
spring cloud互联网分布式微服务云平台规划分析--spring cloud定时调度平台
查看>>
说说如何配置 Webpack
查看>>