阿翰 剑指offer 之 Day01 栈与队列

本文介绍如何使用两个栈实现队列,并提供多种高效实现方式。同时,还探讨了如何创建一个能快速获取最小值的栈,确保min、push及pop操作均达到O(1)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用两个栈实现队列https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/

 

package jzof.Day01;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Stack;

/**
 * @author ahan
 * @create_time 2021-11-03-3:04 下午
 *
 * 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,
 * 分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
 *
 *
 */
public class _09 {
    public static void main(String[] args) {
        CQueue cq = new CQueue();
        cq.appendTail(1);
        cq.appendTail(2);
        cq.appendTail(3);
        System.out.println(cq.deleteHead());
    }
}

class CQueue {
//    Stack<Integer> stack_1;
//    Stack<Integer> stack_2;
    Deque<Integer> stack_1;
    Deque<Integer> stack_2;
//    stack方法都是加锁的,stack上推荐用Deque<Integer> stack = new ArrayDeque<Integer>()替换stack,看源码便知
    public CQueue() {
//        stack_1 = new Stack<Integer>();
//        stack_2 = new Stack<Integer>();
        stack_1 = new LinkedList<Integer>();
        stack_2 = new LinkedList<Integer>();
    }
// 解法 1 效率次差
//    public void appendTail(int value) {
//        while(!stack_2.isEmpty()){
//            stack_1.push(stack_2.pop());
//        }
//        stack_1.push(value);
//        while(!stack_1.isEmpty()){
//            stack_2.push(stack_1.pop());
//        }
//    }
//
//    public int deleteHead() {
//        return stack_2.isEmpty() ? -1 : stack_2.pop();
//    }
    public void appendTail(int value) {
          stack_1.push(value);
    }
// 解法2_-1 效率最差
     public int deleteHead() {
        while(!stack_1.isEmpty()){
            stack_2.push(stack_1.pop());
        }
        int value = stack_2.isEmpty()? -1 :stack_2.pop();
        while(!stack_2.isEmpty()){
            stack_1.push(stack_2.pop());
        }
        return value;
    }
// 解法2_0
//    先判断栈2如果不是空 直接pop
//    如果是空 再把1搬过来 最后判断 输出
    public int deleteHead2_0() {
        if(!stack_2.isEmpty()){
            return stack_2.pop();
        }else{
            while(!stack_1.isEmpty()){
                stack_2.push(stack_1.pop());
            }
            return stack_2.isEmpty() ? -1 : stack_2.pop();
        }
    }
// 解法2_1
//    如果第二个栈为空 先搬过来1的所有内容
//    再进行判断输出
    public int deleteHead2_1() {
        if (stack_2.isEmpty()) {
            while (!stack_1.isEmpty()) {
                stack_2.push(stack_1.pop());
            }
        }
        return stack_2.isEmpty() ? -1 : stack_2.pop();
    }
}

 效率提升最终

包含min函数的栈https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/

package jzof.Day01;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Stack;

/**
 * @author ahan
 * @create_time 2021-11-03-4:15 下午
 *
 * 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
 *
 */
public class _30 {
    public static void main(String[] args) {
        MinStack minStack = new MinStack();
        minStack.push(1);
        minStack.push(4);
        minStack.push(1);
        minStack.push(6);
        System.out.println(minStack.min());

    }
}

class MinStack {
    Stack<Integer> A, B;
    public MinStack() {
        A = new Stack<>();
        B = new Stack<>();
    }
    public void push(int x) {
        A.add(x);
        if(B.empty() || B.peek() >= x)
            B.add(x);
    }
    public void pop() {
        if(A.pop().equals(B.peek()))
            B.pop();
    }
    public int top() {
        return A.peek();
    }
    public int min() {
        return B.peek();
    }
}

这里是LeetCode的大佬解析,我用的linkedlist 报错。。。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值