"Coding Interview Guide" -- 设计一个有getMin功能的栈
Posted latup
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了"Coding Interview Guide" -- 设计一个有getMin功能的栈相关的知识,希望对你有一定的参考价值。
【题目】
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
【要求】
1. pop、push、getMin操作的时间复杂度都是O(1)
2. 设计的栈类型可以使用现成的栈结构
【分析】
栈是一种只能在另一端进行操作的具有“先进后出”特性的数据结构,它有push(元素入栈)、pop(元素出栈)、peek(访问栈顶元素)、size(获取栈元素个数)和isEmpty(判断栈是否为空)等基本功能
一般来说,栈并没有提供返回当前栈中最小元素的方法。因为栈只允许在栈顶对元素进行操作,所以如果只使用一个栈来存储元素,那么我们是无法知道当前栈中的最小元素的,严格地说,对于一个非空栈,我们永远都只知道当前的栈顶元素是什么。所以只用一个栈结构难以实现getMin功能。可以考虑增加一个辅助栈结构,用来记录栈的所有可能最小元素序列。
1 import java.util.Stack; 2 3 class MyStack 4 { 5 private Stack<Integer> dataStack; 6 private Stack<Integer> minStack; 7 8 public MyStack() 9 { 10 dataStack = new Stack<>(); 11 minStack = new Stack<>(); 12 } 13 14 public void push(int data) 15 { 16 dataStack.push(data); 17 if(minStack.empty()) // 辅助栈为空或者栈顶元素小于或等于data时将data入栈,说明将data压入dataStack中后,当前dataStack的最小元素就是data,所以要更新minStack 18 { 19 minStack.push(data); 20 } 21 else if(data <= minStack.peek()) 22 { 23 minStack.push(data); 24 } 25 } 26 27 public int pop() 28 { 29 if(dataStack.empty()) 30 { 31 throw new RuntimeException("fail to pop, stack is empty."); 32 } 33 else 34 { 35 int data = dataStack.pop(); 36 if(data == getMin()) // 如果dataStack栈弹出的元素是当前dataStack中的最小元素,则弹出操作之后,需要对minStack栈进行更新 37 { 38 minStack.pop(); 39 } 40 return data; 41 } 42 } 43 44 public int getMin() 45 { 46 if(minStack.empty()) 47 { 48 throw new RuntimeException("fail to getMin, stack is empty."); 49 } 50 return minStack.peek(); 51 } 52 53 public int size() 54 { 55 return dataStack.size(); 56 } 57 58 public boolean isEmpty() 59 { 60 return dataStack.empty(); 61 } 62 }
来源:左程云老师《程序源代码面试指南》
以上是关于"Coding Interview Guide" -- 设计一个有getMin功能的栈的主要内容,如果未能解决你的问题,请参考以下文章
"Coding Interview Guide" -- 仅用递归函数和栈操作逆序一个栈
"Coding Interview Guide" -- 判断二叉树是否为平衡二叉树
"Coding Interview Guide" -- 只用位运算不用算术运算实现整数的加减乘除运算
为啥这个例子的时间复杂度来自“Cracking the Coding Interview” O(k c^k)?