1、题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中调用push、pop、top、min的时间复杂度都是o(1)。
解题思路:运用一个辅助栈,用于存储当前数据最小的数,当最小元素栈没有元素的时候直接放入数据,
当有元素的时候进行比较是不是来的数据比最小栈中的数据小,如果进来的数据更小,就入栈最小数据栈中,否则就不入最小数据栈。
stackMin.push(stackMin.isEmpyt()? data:Math.min(data,stackMin.peek()))。
剑指offer代码:
- import java.util.Stack;
- public class Solution {
- Stack<Integer> stack = new Stack<Integer>();
- Stack<Integer> stackMin = new Stack<Integer>();
- public void push(int node) {
- stack.push(node);
- stackMin.push(stackMin.isEmpty()?node:Math.min(node,stackMin.peek()));
- }
- public void pop() {
- stack.pop();
- stackMin.pop();
- }
- public int top() {
- return stack.peek();
- }
- public int min() {
- return stackMin.peek();
- }
- }
本机测试代码如下:
- package pratice618;
- import java.util.Stack;
- //题目说明:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
- // 在该栈中调用push、pop、top、min的时间复杂度都是o(1)。
- //解题思路:运用一个辅助栈,用于存储当前数据最小的数,当最小元素栈没有元素的时候直接放入数据,
- // 当有元素的时候进行比较是不是来的数据比最小栈中的数据小,如果进来的数据更小,就入栈最小数据栈中,否则就不入最小数据栈。
- // stackMin.push(stackMin.isEmpyt()? data:Math.min(data,stackMin.peek()))
- public class StackMin30_711 {
- static Stack<Integer> stack = new Stack<Integer>();
- static Stack<Integer> stackMin = new Stack<Integer>();
- public static void push(int data){
- stack.push(data);
- stackMin.push(stackMin.isEmpty()? data:Math.min(data, stackMin.peek()));
- }
- public void pop(){
- stack.pop();
- stackMin.pop();
- }
- public static int min(){
- return stackMin.peek();
- }
- public static void main(String[] args) {
- int data[] = {12,4,5,7,2,6,3};
- for(int i=0;i<data.length;i++)
- {
- push(data[i]);
- }
- int minS = min();
- System.out.print("minS "+minS);
- }
- }
2、题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。
解题思路:出栈可能的个数:n=(2n!) / (n! * (n+1)!).
出栈的每个元素后面比该元素的原下标小的元素,应该按原下标从大到小的相对顺序排列。
根据两个队列进行出栈操作,看是否符合,最终栈是否为空。
- package pratice618;
- import java.util.Stack;
- public class StackPopPush31_711 {
- //题目说明:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
- // 例如序列 1,2,3,4,5 是某栈的压入顺序,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。
- //解题思路:出栈可能的个数:n=(2n!) / (n! * (n+1)!)
- // 出栈的每个元素后面比该元素的原下标小的元素,应该按原下标从大到小的相对顺序排列
- // 根据两个队列进行出栈操作,看是否符合,最终栈是否为空
- public static boolean stackPopPush(int pop[],int push[]){
- Stack<Integer> stack = new Stack();
- for(int popI=0,pushI=0; pushI<push.length; pushI++)
- {
- stack.push(push[pushI]);
- while(popI<push.length && !stack.isEmpty() && stack.peek() == pop[popI])
- {
- stack.pop();
- popI++;
- }
- }
- return stack.isEmpty();
- }
- public static void main(String[] args) {
- int push[] = {2,3,4,5,6};//输入
- int pop[] = {2,4,5,3,6};//输出
- boolean result = stackPopPush(pop,push);
- System.out.print("result: "+ result);
- }
- }