用队列实现栈---超全详细解

以下内容是从网站中学习的。

使用队列实现栈的下列操作:

push(x)--元素x入栈

pop()--移除栈顶元素

top()--获取栈顶元素

empty()--返回栈是否为空

注意:

你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。

你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。

思路

(这里要强调是单向队列)

刚刚做过栈与队列:用栈来实现队列的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行!

队列模拟栈,其实一个队列就够了。

一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外)重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。

使用一个Queue实现:

复制代码
class MyStack{
    Queue<Integer> queue;

    public MyStack(){
        queue = new LinkedList<>();
    }

    //每 offer一个数(A)进来,都重新排列,把这个数(A)放到队列的队首
    public void push(int x){
        queue.offer(x);//将新元素加到队尾
        int size = queue.size();
        //移动除了A的其他元素
        while(size > 1){
            queue.offer(queue.poll());
            size--;
        }
    }
        public int pop(){
            return queue.poll();
        }
        public int top(){
            return queue.peek();
        }
        public boolean empty(){
            return queue.isEmpty();
        }
    }

时间复杂度:push:O(n) 其他是O(1)

空间复杂度:O(n)

相关推荐
不是万能的豆学长2 小时前
filetidy 文件整理助手:一键归类 + 规范重命名(Python 零依赖单文件工具)
大数据·开发语言·python·技术美术
时间静止不是简史2 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
2301_32241428045 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
懂点Tech6 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
金銀銅鐵7 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
catchadmin7 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
福建佰胜张工8 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
念何架构之路8 小时前
go-grpc设计思想
开发语言·后端·golang
catoop8 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x8 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端