两个栈实现队列(D)

java 复制代码
import java.util.Stack;

public class TwoStackQueue {
    private Stack<Integer> stackPush;
    private Stack<Integer> stackPop;

    public TwoStackQueue() {
        stackPush = new Stack<Integer>();
        stackPop = new Stack<Integer>();
    }

    private void pushToPop() {
        if (stackPop.empty()) {
            while (!stackPush.empty()) {
                stackPop.push(stackPush.pop());
            }
        }
    }

    public void add(int pushInt) {
        stackPush.push(pushInt);
        pushToPop();
    }

    public int poll() {
        if (stackPop.empty() && stackPush.empty()) {
            throw new RuntimeException("Queue is empty!");
        }
        pushToPop();
        return stackPop.pop();
    }

    public int peek() {
        if (stackPop.empty() && stackPush.empty()) {
            throw new RuntimeException("Queue is empty!");
        }
        pushToPop();
        return stackPop.peek();
    }

    public static void main(String[] args) {
        TwoStackQueue queue = new TwoStackQueue();
        queue.add(1);
        queue.add(2);
        queue.add(3);
        System.out.println(queue.poll());
        System.out.println(queue.peek());
        System.out.println(queue.poll());

    }
}

这个算法通过两个栈结构巧妙地模拟了一个队列的行为,其中stackPush用于处理入队操作,而stackPop用于处理出队操作。当需要出队时,算法会检查stackPop是否为空,如果为空,则将stackPush中的所有元素逆序转移到stackPop中,从而确保stackPop的栈顶元素是队列的头部元素。这种方法使得入队操作的时间复杂度为O(1),而出队操作在最坏情况下的时间复杂度为O(n),但平均时间复杂度仍为O(1),因为每个元素只被移动一次。整体上,该算法高效地利用了栈的后入先出特性来实现了队列的先进先出特性。

相关推荐
一决威严-雪雪2 分钟前
springboot整合admin
java·spring boot·后端
吴秋霖2 分钟前
某漫画网站JS逆向反混淆流程分析
开发语言·javascript·ecmascript
栗筝i3 分钟前
Spring 中的常用注解
java·后端·spring
Growthofnotes6 分钟前
C++—14、C++ 中的指针最基础的原理
开发语言·c++
小登ai学习21 分钟前
框架部分面试题学习
java·学习·面试
星星不闪包退换27 分钟前
css面试常考布局(圣杯布局、双飞翼布局、三栏布局、两栏布局、三角形)
前端·css
MilesMatheson33 分钟前
ubuntu 编译android源码报错:loadlocale.c:129: _nl_intern_locale_data:
c语言·开发语言·算法
sysu6342 分钟前
73.矩阵置零 python
开发语言·数据结构·python·线性代数·leetcode·面试·矩阵
new66699943 分钟前
Java实现命令模式
java·命令模式
程序员奇奥44 分钟前
统计有序矩阵中的负数
线性代数·算法·矩阵