问题描述
设计一个栈,其中包括
- push():给栈中添加元素
- pop():获取栈顶元素(顺便将栈顶元素删除)
- top():读取栈顶元素(不删除元素)
- getMin():读取当前栈中的最小元素
示例
代码 | 结果 |
---|---|
MinStack minStack = new MinStack() | 无返回 |
minStack.push(-2) | 无返回 |
minStack.push(0) | 无返回 |
minStack.push(-3) | 无返回 |
minStack.getMin() | -3 |
minStack.pop() | 无返回 |
minStack.top() | 0 |
min.getMin() | -2 |
代码演示
代码1
- 思路分析
设置两个栈,一个栈用来正常放数据,第二个栈用来放当前栈中的最小数据
…… 下边的步骤不演示了,大概就是这样了 - 代码
class MinStack {
/** initialize your data structure here. */
Stack<Integer> stack = new Stack<>();
Stack<Integer> minStack = new Stack<>();
public MinStack() {
}
public void push(int x) {
stack.push(x);
if(!minStack.isEmpty()){
if(x <= minStack.peek()){
minStack.push(x);
}
}else{
minStack.push(x);
}
}
public void pop() {
int top = stack.pop();
if(top == minStack.peek()){
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}
方法2
- 在方法1 中的最小值,用一个新的栈将其存了起来,我们可以用一个参数存这个值。
删除 2 之后,将删除后的栈顶数据 3 赋值给 min
……之后的操作也不再演示了 - 代码:
public class MinStack {
Stack<Integer> stack;
int min = Integer.MAX_VALUE;
public MinStack() {
stack = new Stack<>();
}
public void push(int x) {
if(!stack.isEmpty()){
if(x <= min){
stack.push(min);
min = x;
}
}else{
min = x;
}
stack.push(x);
}
public void pop() {
if(stack.peek() == min){
stack.pop();
if(!stack.isEmpty()){
min = stack.pop();
}
}else{
stack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return this.min;
}
}
方法3
- 思路:我们不用Java提供的Stack,用一个链表实现stack的基础操作,至于 getMin(),我们可以在每个节点中存入一个 min 的值,用来表示当前链表的最小值。
- 代码:
public class MinStack{
class Node{
int val;
Node next;
int min;
public Node(int val, int min) {
this.val = val;
this.min = min;
next = null;
}
}
Node head;
public MinStack() {
}
public void push(int x) {
if(head == null){
head = new Node(x, x);
}else{
Node node = new Node(x, Math.min(x, head.min));
node.next = head;
head = node;
}
}
public void pop() {
if(head != null){
head = head.next;
}
}
public int top() {
if(head != null){
return head.val;
}else{
return -1;
}
}
public int getMin() {
if(head != null){
return head.min;
}else{
return -1;
}
}
}