数据结构:用双栈实现一个队列

server/2024/12/22 11:03:00/

要用两个栈实现一个队列,可以利用“栈”的后进先出 (LIFO) 特性来模拟“队列”的先进先出 (FIFO) 操作。具体做法是使用两个栈:一个作为入栈栈,另一个作为出栈栈。

算法步骤

  1. 入队操作(enqueue): 将元素压入“入栈栈”。
  2. 出队操作(dequeue): 如果“出栈栈”为空,就将“入栈栈”中的所有元素逐个弹出并压入“出栈栈”,然后从“出栈栈”弹出栈顶元素。否则,直接从“出栈栈”弹出栈顶元素。

这种方法确保了队列的先进先出(FIFO)特性。

Java 实现

import java.util.Stack;public class QueueWithTwoStacks<T> {// 入栈栈,用于接收新元素private Stack<T> stackIn;// 出栈栈,用于弹出元素private Stack<T> stackOut;// 构造函数public QueueWithTwoStacks() {stackIn = new Stack<>();stackOut = new Stack<>();}// 入队操作,将元素压入入栈栈public void enqueue(T item) {stackIn.push(item);}// 出队操作,从出栈栈弹出元素public T dequeue() {// 如果出栈栈为空,则将入栈栈的元素倒入出栈栈if (stackOut.isEmpty()) {if (stackIn.isEmpty()) {throw new RuntimeException("Queue is empty");}while (!stackIn.isEmpty()) {stackOut.push(stackIn.pop());}}return stackOut.pop();}// 获取队列头部元素,但不出队public T peek() {if (stackOut.isEmpty()) {if (stackIn.isEmpty()) {throw new RuntimeException("Queue is empty");}while (!stackIn.isEmpty()) {stackOut.push(stackIn.pop());}}return stackOut.peek();}// 判断队列是否为空public boolean isEmpty() {return stackIn.isEmpty() && stackOut.isEmpty();}public static void main(String[] args) {QueueWithTwoStacks<Integer> queue = new QueueWithTwoStacks<>();queue.enqueue(1);queue.enqueue(2);queue.enqueue(3);System.out.println(queue.dequeue()); // 输出 1System.out.println(queue.peek());    // 输出 2System.out.println(queue.dequeue()); // 输出 2queue.enqueue(4);System.out.println(queue.dequeue()); // 输出 3System.out.println(queue.dequeue()); // 输出 4}
}

解释:

  1. 两个栈: stackIn 是用于入队的栈,stackOut 是用于出队的栈。
  2. 入队操作: 元素被直接压入 stackIn,这保证了入队的顺序。
  3. 出队操作: 当 stackOut 为空时,将 stackIn 中的所有元素倒入 stackOut,以便反转元素顺序,使其符合队列的 FIFO 特性。

这样,你就可以使用两个栈来实现一个队列,且满足队列的基本功能。


http://www.ppmy.cn/server/132230.html

相关文章

面试题:Redis(二)

1. 面试题 2. MoreKey案列 事故案例 2.1 生成上如何限制key*/flushdb/flushall等危险命令的使用&#xff1f; 通过redis.conf配置文件中在SECURITY选项中禁用这些命令 2.2 不用key*避免卡顿那用什么&#xff1f; 用scan命令&#xff0c;类似mysql中的limit命令 语法&…

RDD优化:缓存和checkpoint机制、数据共享(广播变量、累加器)、RDD的依赖关系、shuffle过程、并行度说明

文章目录 1. 缓存和checkpoint机制1.1 缓存使用1.2 checkpoint1.3 缓存和checkpoint的区别 2. 数据共享2.1 广播变量2.2 累加器 3. RDD依赖关系4.shuffle过程4.1 shuffle介绍4.2 spark计算要尽量避免shuffle 5. 并行度 1. 缓存和checkpoint机制 缓存和checkpoint也叫作rdd的持…

Tars RPC源码--C++客户端

Communicator: 客户端最重要的一个类&#xff0c;一个客户端只能生成一个Communicator类的实例&#xff0c;CommunicatorPtr& Application::getCommunicator(),获取线程安全的单例。 ServantProxy与ServantProxyFactory ServantProxy是服务代理&#xff0c;可以由Servan…

C/C++逆向:函数逆向分析-总体流程(整型指针)

函数的初始化 在逆向工程中&#xff0c;函数的初始化操作是函数在开始执行时&#xff0c;为正确运行而进行的准备工作。通常&#xff0c;这些操作发生在函数的序言&#xff08;Prologue&#xff09;阶段&#xff0c;具体的内容和顺序会因编译器、调用约定和目标平台&#xff0…

Golang | Leetcode Golang题解之第476题数字的补数

题目&#xff1a; 题解&#xff1a; func findComplement(num int) int {highBit : 0for i : 1; i < 30; i {if num < 1<<i {break}highBit i}mask : 1<<(highBit1) - 1return num ^ mask }

Python快速编程小案例——猜数字

提示&#xff1a;&#xff08;个人学习&#xff09;&#xff0c;案例来自工业和信息化“十三五”人才培养规划教材&#xff0c;《Python快速编程入门》第2版&#xff0c;黑马程序员◎编著 猜数游戏是一种经典的密码破译类益智游戏&#xff0c;通常由两个人参与。一个人在心中设…

Unity3D相关知识点总结

Unity3D使用的是笛卡尔三维坐标系&#xff0c;并且是以左手坐标系进行展示的。 1.全局坐标系&#xff08;global&#xff09; 全局坐标系描述的是游戏对象在整个世界&#xff08;场景&#xff09;中的相对于坐标原点&#xff08;0&#xff0c;0&#xff0c;0&#xff09;的位置…

机器学习与神经网络的发展前景

目录 引言 1 机器学习与神经网络在各领域的具体应用和作用 2 展望机器学习与神经网络的未来 个人对机器学习与神经网络的看法 引言 在2024年&#xff0c;诺贝尔物理学奖破天荒地颁给了机器学习与神经网络领域的研究者&#xff0c;这一决定不仅震惊了科学界&#xff0c;也标…