剑指Offer-包含min函数的栈

时间:2021-04-21 22:49:40
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的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();    }}