【算法】简单讲解如何使用两个栈实现一个队列

news2025/1/19 17:14:34

文章目录

  • 什么是栈和队列?
  • 设计思路
  • 代码实现

什么是栈和队列?

栈和队列其实大家基本都知道是什么,或者说,最基本的,他们的特性我们是知道的。
栈是一种FILO先进后出的数据结构,队列是一种FIFO先进先出的数据结构。

那么其实他们两个是反过来的,那么,我们其实就可以通过两个栈,实现一个队列,下面是一个简单的代码,包含了add,poll,peek方法。

设计思路

具体的实现是,一个栈作为压入栈,在压入数据时只往这个栈中压入,几位stackPush,另一个栈作为弹出栈,在弹出数据时,只从这个栈中弹出,记为stackPop。
因为数据压入栈的时候,顺序是先进后出的。那么只要把 stackPush的数据再压入stackPop中,顺序就变回来了。例如,将1-5依次压入 stackPush,那么从stackIn的栈顶到栈底为 5-1,此时依次再将5-1倒入stackPop,那么从stackOut的栈顶到栈底就变成了1~5。再从 stackPop弹出时,顺序就像队列一样。
在这里插入图片描述
听起来虽然简单,实际上必须做到以下两点。
1.如果 stackPush要往是stackPop中压入粉据.那么必须一次性把 stackPush中的数据全部压
2.如果stackPop不为空,sctarkPuch绝对不能向 stackPop中压入数
违反了以上两点都会发生错误。
违反1的情况举例:
1-5依次压入 stackPush,stackPush的栈顶到栈底为5~1,从stackPush压入stackPop时,只将5和4压入了 stackPop,stackPush还剩下1、2、3没有压入。此时如果用户想进行弹出操作,那么4将最先弹出,与预想的队列顺序就不一致
违反2的情况举例:
1-5依次压入 stackPush,stackPush将所有的数据压入stackPop,此时从 stackPop的栈顶到栈底就变成了1-5。此时又有6-10依次压入 stackPush,stackPop不为空,stackPush不能向其中压入数据。如果违反2压入了stackPop,从 stackPop 的栈顶到栈底就变成了6-10、1~5。那么此时如果用户想进行弹出操作,6将最先弹出,与预想的队列顺序就不一致。
上面介绍了压入数据的注意事项。那么这个压入数据的操作在何时发生呢?
这个选择的时机可以有很多,调用add、poll和 peek三种方法中的任何一种时发生“压”入数据的行为都是可以的。只要满足如上提到的两点,就不会出错。具体实现请参看如下的代码,代码比较简单

代码实现

package com.base.learn.stack;

import com.sun.org.apache.bcel.internal.generic.PUSH;

import java.util.Stack;

/**
 * @author: 张锦标
 * @date: 2023/5/27 14:43
 * StackMakeQueue类
 * 使用两个栈形成一个队列
 * 支持队列的add poll peek
 */
public class StackMakeQueue {
    private Stack<Integer> stackPush = new Stack<>();
    private Stack<Integer> stackPop = new Stack<>();

    public void add(int num){
        stackPush.push(num);
        inToOut();
    }
    private void inToOut(){
        //只有空的时候才能把in的数据放入到out,不然顺序就乱了
        if (stackPop.empty()){
            while (!stackPush.empty()){
                stackPop.push(stackPush.pop());
            }
        }
    }
    public int poll(){
        if (stackPop.isEmpty() && stackPush.isEmpty()){
            throw new RuntimeException("栈中并没有数据");
        }
        //如果说in栈中有数据 但是out栈中没有 那么把数据移动到out栈中
        inToOut();
        return stackPop.pop();
    }

    public int peek(){
        if (stackPop.isEmpty() && stackPush.isEmpty()){
            throw new RuntimeException("栈中并没有数据");
        }
        //如果说in栈中有数据 但是out栈中没有 那么把数据移动到out栈中
        inToOut();
        return stackPop.peek();
    }
     public static void main(String[] args) {
        StackMakeQueue stackMakeQueue = new StackMakeQueue();
        stackMakeQueue.add(1);
        stackMakeQueue.add(2);
        stackMakeQueue.add(3);
        System.out.println(stackMakeQueue.poll());
        System.out.println(stackMakeQueue.poll());
        System.out.println(stackMakeQueue.poll());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/575929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SRS流媒体服务器 ---- st-thread框架

1.使用st-thread 我们用一个简单的demo研究一下st框架。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include "st.h"static void *_thread(void *arg) {printf("thread: %lu\n", pthread_self());return NULL; }i…

实例6.1 六度空间

“六度空间”理论又称作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理论。这个理论可以通俗地阐述为&#xff1a;“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是说&#xff0c;最多通过五个人你就能够认识任何一个陌生人。”如图1所示…

MySql MVCC 详解

注意以下操作都是以InnoDB引擎为操作基准。 一&#xff0c;前置知识准备 1&#xff0c;MVCC简介 MVCC 是多版本并发控制&#xff08;Multiversion Concurrency Control&#xff09;的缩写。它是一种数据库事务管理技术&#xff0c;用于解决并发访问数据库的问题。MVCC 通过创…

ROS学习——Gazebo中搭建模型并显示

一、打开gazebo搭建模型 gazebo 在gazebo界面左上角点击“Edit”——>"Building Editor"进入下图的模型搭建界面。可以自己利用左边的材料搭建模型。 点击墙壁之类的物品&#xff0c;右键&#xff0c;点击“Open Wall Inspector”按钮&#xff0c;就会出现可以调…

jmeter做接口压力测试_jmeter接口性能测试

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是免…

第11届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 对对碰 题目说明 编程实现 对对碰 两两相同的一共四张扣下的纸牌&#xff0c;每次先后翻开两张。如果两张一样就消失&#xff0c;如果两张不一样就重新扣下。当舞台上所有纸牌都消失&#xff0c;就过关了 .1)创建四个经牌角色&#xff0c;每张纸牌…

linuxOPS基础_Linux文件管理

Linux下文件命名规则 可以使用哪些字符&#xff1f; 理论上除了字符“/”之外&#xff0c;所有的字符都可以使用&#xff0c;但是要注意&#xff0c;在目录名或文件名中&#xff0c;不建议使用某些特殊字符&#xff0c;例如&#xff0c; <、>、&#xff1f;、* 等&…

表单重复提交:

1. 表单重复提交原因 当用户提交完请求&#xff0c;浏览器会记录最后一次请求的全部信息。用户按下功能键F5&#xff0c;就会发起浏览器记录的最后一次请求。如果最后一次请求为添加操作&#xff0c;那么此时刷新按钮就会再次提交数据&#xff0c;造成表单重复提交。 2. 表单…

Hive优化

Hive的本质是MapReduce&#xff0c;优化其实大部分是对mapreduce的优化 hive优化目标&#xff1a;①横向增加并发&#xff0c;②纵向减少依赖 //开启mapjoin&#xff0c;默认为 true • set hive.auto.convert.join true; //开启map端数据聚合 • hive.map.aggrtrue&…

API的应用范围主要有哪些方面?

API&#xff08;Application Programming Interface&#xff09;即应用程序接口&#xff0c;它是一组规则和工具&#xff0c;通过 HTTP 协议将两个软件应用程序之间的通信连接起来。API 的设计可以使不同应用程序的数据和功能进行交互和共享&#xff0c;从而促进了各种应用程序…

对讲机在未来会有更好的发展吗?

对讲机经过几十年的发展&#xff0c;目前在很多领域都有着广泛的应用。那么在未来对讲机还会有更好的发展吗&#xff1f; 对讲机未来会有更好的发展吗 下面河南宝蓝小编根据目前的发展情况做一些猜想&#xff1a; 一、更高的频率范围 目前对讲机所使用的频率范围主要是在VHF…

Spring的作用域和生命周期

目录 1.Bean的作用域 2.Bean的作用域的分类 3.设置作用域 4.Spring的执行流程&#xff08;生命周期&#xff09; 5.Bean的生命周期 1.Bean的作用域 lombok &#xff08;dependency依赖&#xff09; 是为了解决代码的冗余&#xff08;比如说get和set方法&#xff09;那些构造…

平衡二叉树的插入,删除以及平衡调整。

一&#xff0c;平衡二叉树插入失衡情况及解决方案 由于各种的插入导致的不平衡&#xff0c;每次调整都是最小不平衡子树。 LL&#xff1a;由于在结点A的 左孩子的左子树 插入结点导致失衡。 右单旋&#xff1a;①将A的 左孩子B 向右上旋转 代替A成为根节点       ②将A结…

从零开始:使用低代码平台开发OA系统的教程

随着中小型企业持续拥抱数字化转型&#xff0c;对支持业务流程的定制软件应用程序的需求增加。而办公自动化(OA)系统是一个有助于自动执行重复性任务并简化工作流程的系统。按照传统的开发模式&#xff0c;开发OA系统可能既耗时又昂贵&#xff0c;需要经验丰富的开发人员从头开…

ESP32-IDF MQTT连接aws亚马逊云

ESP32-IDF MQTT连接aws亚马逊云 文章目录 ESP32-IDF MQTT连接aws亚马逊云1. 云端配置2. 设备端配置3. 总结 1. 云端配置 登录AWS&#xff0c;地址: https://aws.amazon.com/ 选择IOT core 服务 创建云端设备&#xff0c;点击连接一台设备 进行云端设备创建&#xff0c;按照流…

1020. 飞地的数量

1020. 飞地的数量 C代码&#xff1a;DFS void dfs (int** grid, int x, int y, int m, int n) {if (x < 0 || x > m || y < 0 || y > n || grid[x][y] 0) {return;}grid[x][y] 0;dfs(grid, x 1, y, m, n);dfs(grid, x - 1, y, m, n);dfs(grid, x, y 1, m, n);…

Activiti7学习笔记

Activiti7学习 工作流相关概念 工作流 工作流(Workflow)&#xff0c;就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程&#xff0c;从而实现某个预期的业务目标&#xff0c;或者促使此目…

new bing 初体验:辅助看论文刚刚好

1. new bing使用条件 &#xff08;1&#xff09;安装Microsoft edge的dev版本 https://www.microsoft.com/zh-cn/edge/download?formMA13FJ &#xff08;2&#xff09;浏览器侧栏打开 Discover (3) 进入new bing 页面 侧栏展示 new bing 如果这一步&#xff0c;没有聊天功能…

公司新来了个一年测试经验拿15K的,发现是个00后卷王····

个个都说想躺平了&#xff0c;可是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;才工作一年&#xff0c;跳槽到我们公司起薪15K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

【数组的深刻理解】

#include<stdio.h> #define N 10 int main() {int a[N] { 0 }; //定义并初始化数组return 0; } 概念&#xff1a;数组是具有相同数据类型的集合。 数组的内存布局 #include<stdio.h> int main() {int a 10;int b 20;int c 30;printf("%p\n", &a…