《剑指offer》5-使用2个栈实现队列【Java+Python】

伽叶
• 阅读 786

使用2个栈实现队列

  1. 题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。

  1. 示例

无 需要先明白2点:队列是先进先出的,栈是先进后出的

  1. 解题思路

需要两个栈Stack1和Stack2,push的时候直接push进Stack1。pop需要判断Stack1和Stack2中元素的情况,Stack1空的话,直接从Stack2 pop,Stack1不空的话,把Stack1的元素push进入Stack2,然后pop Stack2的值。

1.push: 直接push进stack1。需要pop全部stack2,才开始将stack1元素放进stack2中

2.pop:if stack2 不为空,直接pop stack2;if stack2 为空,需要将stack1元素全部放入stack2中,然后pop

  1. Java实现
import java.util.Stack;
 
public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        stack1.push(node);
        
    }
    
    public int pop() {
        if (stack1.isEmpty() && stack2.isEmpty()){
            return -1;
        }
        
        if (stack2.isEmpty()){
            while (!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    
    }
}
  1. Python实现
# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []
        
    def push(self, node):
        # write code here
        self.stack1.append(node)
        
    def pop(self):
        # return xx
        if not self.stack1 and not self.stack2: 
            return 
        
        if not self.stack2: #如果stack2为空
            while self.stack1:
                self.stack2.append(self.stack1.pop())
        return self.stack2.pop()   

如果您觉得本文有用,请点个“在看”
《剑指offer》5-使用2个栈实现队列【Java+Python】

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
stack顺序存储结构
《偶刚开始学习数据结构,欢迎拍砖111》栈是只能通过访问它的一段来实现数据存储的一种线性数据结构,换句话来说就是先进后出的原则,FILO,与队列刚好相反哈,现在只说stack。栈包括以下几种基本运算(1)初始化(2)判断是否为空(3)push(4)pop(5)top其他的则根据这几种基本操作进行组合,即可实现。栈的实现同样
似梦清欢 似梦清欢
2年前
栈和队列
栈原理栈(stack)又名堆栈,是一种只能在表尾进行插入和删除操作的线性表。能够进行操作的这一端被称为栈顶,相对地,把另一端称为栈底。:::warning栈内元素操作时先进后出,类似于电梯上下成员,最后进去的人最先出
Stella981 Stella981
3年前
C++ 优先队列priority_queue用法
头文件:include<queue操作:top访问队头empty队列是否为空size返回队列元素个数push插入元素到队尾pop弹出队头swap交换内容定义:1/2Type数据类型3Container容器类型(必须是vect
Wesley13 Wesley13
3年前
04.JUC 集合
基本概念LinkedBlockingQueue是一个用链表实现的有界阻塞队列。LinkedBlockingQueue按照先进先出的原则对元素进行排序。LinkedBlockingQueue采用了双锁、双条件队列来提高读写效率。内部构造LinkedBlockingQueue内部维
Wesley13 Wesley13
3年前
MQTT初始篇笔记整理
MQTT简介MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输),基于TCP/IP协议栈而构建,虽然叫消息队列遥测传输,但是她与消息队列毫无关系,她是一个IBM开发的客户端服务端架构的发布/订阅模式的消息传输协议;她的设计思想是轻巧、开放、简单、规范、易于实现,因此MQTT比较
Stella981 Stella981
3年前
LinkedBlockingQueue 介绍
LinkedBlockingQueue是一个基于已链接节点的、范围任意的blockingqueue。此队列按FIFO(先进先出)排序元素。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可
Wesley13 Wesley13
3年前
C++栈和队列
使用标准库的栈和队列时,先包含相关的头文件include<stackinclude<queue定义栈如下:stack<intstk;定义队列如下:queue<intq;栈提供了如下的操作s.empty()如果栈为空返回true,否则返回fals
Stella981 Stella981
3年前
Redis(四)——消息队列
Redis不仅可作为缓存服务器,还可用作消息队列。它的列表类型天生支持用作消息队列。\\性质:\\由于Redis的列表是使用双向链表实现的,保存了头尾节点,所以在列表头尾两边插取元素都是非常快的。所以可以直接使用Redis的List实现消息队列,只需简单的两个指令lpush和rpop或者rpush和lpop。(列表常用命令)R
Wesley13 Wesley13
3年前
Java并发 阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加操作支持阻塞地插入和移除方法。支持阻塞插入的方法是指当队列满时会阻塞插入元素的线程,直到队列不满;支持阻塞移除的方法是指当队列为空时获取元素的线程无法继续获取元素直到队列不空。可以发现阻塞队列非常适合消费者和生产者场景下进行使用,生产者生产数据就是向阻塞队列中插入元素,消费者消
Wesley13 Wesley13
3年前
PHP优先级队列
优先级队列首先,我们要了解一下什么叫队列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。从定义来看,队列是无法更改顺序的线性集合。线性集合一般有几种规则:先进先出(队
菜园前端 菜园前端
2年前
什么是栈?
原文链接:栈是基础数据结构,栈是一种遵循后进先出原则的有序集合,添加新元素的一端称为栈顶,另一端称为栈底。操作栈的元素时,只能从栈顶操作(添加、移除、取值)。实现功能在JavaScript中没有栈,但是可以通过Array实现栈的所有功能push()入栈po