剑指Offer学习——双栈的巧妙使用

适用双栈的情形,

1、有输入和输出的问题。一个作为输入栈,一个作为输出栈。

2、保留特殊值(最大值,最小值)的问题。一个作为保存所有数据的数据栈,一个作为保留特殊值的辅助栈。

用两个栈实现队列

class CQueue {
        /*
         * 题目:
         * 用两个栈实现一个队列。队列的声明如下
         * 请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。
         * (若队列中没有元素,deleteHead 操作返回 -1 )
         *
         *
         * 思路:
         * 直接插入的数据放入inputStack栈里,满足 appendTail
         * outputStack栈里放要删除的数据。
         * 当outputStack为null时,将整个inputStack转移到outputStack里。
         * 数据从 inputStack --> outputStack 过程中,会把先进入inputStack的数据放到outputStack的栈顶。满足 deleteHead
         *
         *
         * */
        Stack<Integer> stackInput = null;
        Stack<Integer> stackOutput = null;

        public CQueue() {
            stackInput = new Stack<>();
            stackOutput = new Stack<>();
        }

        public void appendTail(int value) {
            stackInput.push(value);
        }

        public int deleteHead() {
            if (!stackOutput.isEmpty()) {
                return stackOutput.pop();
            }
            if (stackInput.isEmpty()) {
                return -1;
            }
            while (!stackInput.isEmpty()) {
                stackOutput.push(stackInput.pop());
            }
            return stackOutput.pop();
        }
    }

包含min函数的栈

class MinStack {
        /*
         * 题目:
         * 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)
         *
         * 思路:
         * 要求时间复杂都为O(1) , 即可以直接完成
         * 使用Stack , push 和 pop 可以直接完成
         * min 函数 , 要求可以获取到当前的最小值
         * 使用一个数据栈保存所有数据,满足 push pop
         * 使用一个辅助堆栈,记录当前数据中的最小值。
         * 新的数据一定比已有数据先移除,注意开始时辅助堆栈为空的情况。
         * 新的数据小于当前最小值时,更新辅助堆栈,当该数据被移除时,辅助堆栈也要移除 ;
         * 新的数据大于当前最小值时,总数据的最小值不变,辅助堆栈无改变。
         *
         * */

        Stack<Integer> dateStack = null;  // 数据栈
        Stack<Integer> minStack = null;  // 辅助栈,存放当前最小值

        public MinStack() {
            dateStack = new Stack<>();
            minStack = new Stack<>();
        }

        public void push(int x) {
            dateStack.add(x);
            if (minStack.isEmpty() || minStack.peek() >= x) {
                minStack.add(x);
            }
        }

        public void pop() {
            int t = dateStack.pop();
            if (t == minStack.peek()) {
                minStack.pop();
            }
        }

        public int top() {
            return dateStack.peek();
        }

        public int min() {
            return minStack.peek();
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值