题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
题目解析
这个题意思不明确,而且代码给出的部分参不透到底是要干嘛,可能我的理解有问题,经过一番折腾才明白是要自己重新写一个类Stack的类,但是包含min函数,能够自己求出他的最小值。
解题思路
我觉得这个题目本身含糊不清,题目给出的代码中,引入了Stack这个类,意思就是可以借助Stack来实现一个包含min方法的栈。或许题目这样出就是拐弯考察答题者的变通性,但是感觉这样做意义不大。
这个题目可以这样想:
定义两个栈,一个用于接收所有的数据,另一个只是用于存储最小的值,当pop的时候如果栈顶就是最小值,两者全部pop栈顶元素,然后只需要将包含所有数据的栈(以下成为stack1)全部出栈存储到另一个存储最小值的栈(以下称stack2)中去,在遍历的过程中求出哪个数据是最小的值,再将数据从stack2中导出到stack1中去,还原了原来的数据,这个地方算是稍微复杂一点的地方,其他的方法难度不大。
实现代码
import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) { stack1.push(node); if(stack2.empty()) { stack2.push(node); }else{ int node2 = stack2.peek(); if(node2 >= node) { stack2.pop(); stack2.push(node); } } } public void pop() { if(stack1.peek() == stack2.peek()) { stack2.pop(); stack1.pop(); int index = 0; int min = 0; while(!stack1.empty()) { int data = stack1.pop(); if(index == 0) min = data; else { min = min > data ? data : min; } stack2.push(data); index ++; } while(!stack2.empty()) { int data = stack2.pop(); stack1.push(data); } stack2.push(min); return ; } stack1.pop(); } public int top() { return stack1.peek(); } public int min() { return stack2.peek(); }}