【算法】使用队列制作一个栈

news/2025/2/5 4:54:07/

文章目录

  • 前言
  • 两个队列形成一个栈
  • 一个队列形成一个栈

前言

栈是一种后进先出的数据结构,元素从顶端入栈,然后从顶端出栈。

队列是一种先进先出的数据结构,元素从后端入队,然后从前端出队。

方法一:两个队列
为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作,其中pushQueue用于存储栈内的元素,popQueue作为入栈操作的辅助队列。

入栈操作时,首先将元素入队到 pushQueue ,然后将 popQueue的全部元素依次出队并入队到
pushQueue,此时pushQueue 的前端的元素即为新入栈的元素,再将 pushQueue和 popQueue互换,则popQueue的元素即为栈内的元素,popQueue的前端和后端分别对应栈顶和栈底。
由于每次入栈操作都确保popQueue的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除 popQueue的前端元素并返回即可,获得栈顶元素操作只需要获得popQueue的前端元素并返回即可(不移除元素)。
由于 popQueue用于存储栈内的元素,判断栈是否为空时,只需要判断popQueue是否为空即可。

两个队列形成一个栈

package com.base.learn.queue;import java.util.LinkedList;
import java.util.Queue;/*** @author: 张锦标* @date: 2023/6/10 10:33* QueueMakeStack类*/
public class TwoQueueMakeStack {//每次最新元素都插入到pushQueue中private Queue<Integer> pushQueue;//出栈的时候使用这个popQueue,用于存放老旧元素private Queue<Integer> popQueue;public TwoQueueMakeStack() {pushQueue = new LinkedList<Integer>();popQueue = new LinkedList<Integer>();}public void push(int x) {//pushQueue.offer(x);//while(!popQueue.isEmpty()){//    pushQueue.offer(popQueue.poll());//}//Queue<Integer> temp = popQueue;//popQueue = pushQueue;//pushQueue = temp;//一个队列也可以实现栈int size = popQueue.size();popQueue.offer(x);for(int i=0;i<size;i++){popQueue.offer(popQueue.poll());}}public int pop() {return popQueue.poll();}public int top() {return popQueue.peek();}public boolean empty() {return popQueue.isEmpty();}
}

一个队列形成一个栈

方法一使用了两个队列实现栈的操作,也可以使用一个队列实现栈的操作。

使用一个队列时,为了满足栈的特性,即最后入栈的元素最先出栈,同样需要满足队列前端的元素是最后入栈的元素。

入栈操作时,首先获得入栈前的元素个数 n,然后将元素入队到队列,再将队列中的前
n 个元素(即除了新入栈的元素之外的全部元素)依次出队并入队到队列,此时队列的前端的元素即为新入栈的元素,且队列的前端和后端分别对应栈顶和栈底。

由于每次入栈操作都确保队列的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除队列的前端元素并返回即可,获得栈顶元素操作只需要获得队列的前端元素并返回即可(不移除元素)。

由于队列用于存储栈内的元素,判断栈是否为空时,只需要判断队列是否为空即可。

package com.base.learn.queue;import java.util.LinkedList;
import java.util.Queue;/*** @author: 张锦标* @date: 2023/6/10 10:44* OneQueueMakeStack类*/
public class OneQueueMakeStack {private Queue<Integer> queue ;public OneQueueMakeStack(){queue = new LinkedList<Integer>();}public void push(int x){int size = queue.size();queue.offer(x);for(int i=0;i<size;i++){queue.offer(queue.poll());}}public int pop(){return queue.poll();}public int top(){return queue.peek();}public boolean empty(){return queue.isEmpty();}
}

http://www.ppmy.cn/news/309769.html

相关文章

数据中心液冷化改造适用技术探析

来源 | 中国工业和信息化 作者 | 曹曦&#xff0c;福建省通信管理局 原文 | DOI:10.19609/j.cnki.cn10-1299/f.2022.12.002 算力需求推动着数据中心功率密度不断提升,能耗、发热量持续攀升。同时&#xff0c;国家“双碳”战略的实施对于数据中心PUE提出更为严苛的要求&#xff…

聚焦绿色低碳,数据中心散热进入“智能冷却”新时代

在绿色数据中心建设中&#xff0c;必须要根据地理位置、工作负载等实际情况&#xff0c;科学地规划和采用不同的冷却系统&#xff0c;才能更加有效降低PUE值&#xff0c;进而实现节能降碳的目标。 出品 | 常言道 作者 | 丁常彦 近年来&#xff0c;数字经济的蓬勃发展&#xff0…

利民发布 HR-10 2280 M.2 SSD 散热器,搭载双 AGHP 逆重力热管

3 月 10 日消息&#xff0c;利民现已发布新款 HR-10 2280 M.2 SSD 散热器&#xff0c;售价 79 元。 据官方介绍&#xff0c;Thermalright 利民 HR-10 2280 散热器采用了高质感电镀回流焊技术&#xff0c;采用大面积散热片&#xff0c;内置双 AGHP 逆重力热管&#xff0c;可为 2…

每日三问-前端(第二十期)

先来回顾一下上期的问题及答案&#xff1a; 2023年6月9日 1. Vue中的$nextTick有什么作用&#xff1f; 2. 说说你对vue的mixin的理解&#xff0c;有什么应用场景&#xff1f; 3. Vue.observable你有了解过吗&#xff1f;说说看 以下是解答&#xff1a; $nextTick 是 Vue 中的一…

【立体视觉(一)】之成像原理与相机畸变

【立体视觉&#xff08;一&#xff09;】之成像原理与相机畸变 一、成像原理一&#xff09;针孔模型二&#xff09;坐标系转换1. 世界坐标系到相机坐标系2. 相机坐标系到图像坐标系3. 图像坐标系到像素坐标系4. 相机坐标系到像素坐标系5. 世界坐标系到像素坐标系 二、相机畸变一…

Redis学习总结(二)

AOF 为什么是在执行完命令之后记录日志&#xff1f; 关系型数据库&#xff08;如 MySQL&#xff09;通常都是执行命令之前记录日志&#xff08;方便故障恢复&#xff09;&#xff0c;而 Redis AOF 持久化机制是在执行完命令之后再记录日志。AOF 记录日志过程为什么是在执行完命…

css3秒杀价格

代码 主要的地方就是中间那个梯形 .miaosha i {position: absolute;width: 0;height: 0;top: 0;right: 0;border-color:transparent #fff transparent transparent ;border-style: solid;border-width: 24px 10px 0 0;}<!DOCTYPE html> <html lang"en">…

DSLR(digital single lens reflex)

扫盲 DSLR&#xff0c;为digital single lens reflex的缩写&#xff0c;直译就是数码、单、镜头、反射&#xff0c;也就是俗称的单反相机了。 因为经常会有一些文章直接以此缩写行文&#xff0c;比较容易蒙住人&#xff0c;所以有必要了解&#xff0c;以防被huyou。 DSLR为DC的…