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

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

前言

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

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

方法一:两个队列

为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作,其中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();
    }
}


相关文章
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
59 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
28 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
17天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
43 3
|
1月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
20 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
2月前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
1月前
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)
|
3月前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
3月前
|
算法
【数据结构与算法】优先级队列
【数据结构与算法】优先级队列
15 0
|
3月前
|
存储 算法
【数据结构与算法】队列(顺序存储)
【数据结构与算法】队列(顺序存储)
30 0