使用两个队列实现栈

在计算机科学中,栈是一种数据结构,它遵循后进先出(LIFO)的原则。这意味着最后一个被添加到栈的元素将是第一个被移除的元素。然而,Java的标准库并没有提供栈的实现,但我们可以使用两个队列来模拟一个栈的行为。

首先,我们需要创建一个名为MyStack的类,该类包含两个栈:queue1queue2。这两个栈将用于实现队列的功能。接下来,我们需要实现队列的基本操作,包括pushpoppeekempty

首先,我们需要创建一个栈类

java 复制代码
public class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;

    public MyStack(){
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }
}

push方法

push(int value): 将一个元素添加到栈中。首先,我们将该元素添加到queue2中。然后,我们将queue1中的所有元素移动到queue2中,直到queue1为空。最后,我们交换queue1queue2的角色,使得queue1始终是栈顶元素所在的队列。

java 复制代码
public void push(int value){
        queue2.offer(value);
        while (!queue1.isEmpty()){
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }

pop方法

pop(): 从栈中移除并返回栈顶元素。由于栈顶元素位于queue1中,我们只需调用queue1.poll()即可。

java 复制代码
public int pop(){
        return queue1.poll();
    }

top()方法

top(): 返回栈顶元素但不将其从栈中移除。由于栈顶元素位于queue1中,我们只需调用queue1.peek()即可。

java 复制代码
public int top(){
        return queue1.peek();
    }

isEmpty方法

isEmpty(): 检查栈是否为空。我们只需检查queue1是否为空即可。

java 复制代码
public boolean isEmpty(){
        return queue1.isEmpty();
    }

完整代码

java 复制代码
public class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;

    public MyStack(){
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }

    public void push(int value){
        queue2.offer(value);
        while (!queue1.isEmpty()){
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }
    public int pop(){
        return queue1.poll();
    }

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

    public boolean isEmpty(){
        return queue1.isEmpty();
    }

}

测试类

java 复制代码
public class Test {
    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        System.out.println(myStack.isEmpty());  // true
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        System.out.println(myStack.pop()); // 3
        System.out.println(myStack.pop()); // 2
        System.out.println(myStack.isEmpty()); // false
        System.out.println(myStack.pop()); // 1
        System.out.println(myStack.isEmpty()); // true
    }
}

运行结果

相关推荐
考虑考虑1 小时前
Jpa使用union all
java·spring boot·后端
用户3721574261352 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊3 小时前
Java学习第22天 - 云原生与容器化
java
渣哥4 小时前
原来 Java 里线程安全集合有这么多种
java
间彧4 小时前
Spring Boot集成Spring Security完整指南
java
间彧5 小时前
Spring Secutiy基本原理及工作流程
java
Java水解6 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆8 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学8 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole9 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端