当前位置: 首页 > news >正文

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

要用两个栈实现一个队列,可以利用“栈”的后进先出 (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.lryc.cn/news/457980.html

相关文章:

  • QScroller Class
  • React高阶组件详解
  • TextView把其它控件挤出屏幕的处理办法
  • 长度为 K 的重复字符子串数目
  • html+css+js实现轮播图
  • Boost集成模型异同
  • 【系统架构设计师】案例专题四:嵌入式系统考点梳理
  • Ngin入门套餐
  • 使用linux编译main.cpp文件
  • 服务器部署‌Traefik 实现子级域名路由服务(对外子域名80,路由对内大端口)
  • @RequestParam @PathVirable @RequestBody @ApiParam的区别
  • Vulnhub靶场案例渗透[5]- DC4
  • http协议概述与状态码
  • Golang 进阶5—— 反射
  • react 封装防抖
  • Java项目-----图形验证码登陆实现
  • 【网络代理模块】反向代理(上)
  • 2-112基于matlab的协同干扰功率分配模型
  • 数据结构之——二叉树
  • 多层感知机(MLP)实现考勤预测二分类任务(sklearn)
  • 文件与目录的基本操作
  • Python入门笔记(三)
  • PostgreSQL 任意命令执行漏洞(CVE-2019-9193)
  • 使用tgz包下载安装clickhouse低版本
  • 外包功能测试干了6个月,技术退步太明显了。。。。。
  • 动态规划和贪心算法
  • python爬虫--tx动漫完整信息抓取
  • 《使用Java做爬虫和使用python做爬虫哪个好》
  • 如果我想开发一个APP,需要准备哪些材料呢
  • 告别论文初稿焦虑!ChatGPT让你轻松完成写作!