首页 > 其他分享 >力扣-232. 用栈实现队列

力扣-232. 用栈实现队列

时间:2024-05-10 14:46:22浏览次数:20  
标签:int outstack outStack pop 力扣 用栈 232 push empty

1.题目信息

2.题解

2.1 双栈的使用(用栈实现队列)

思路

我们一开始可能会想到对于每次入栈操作——由于我们可能希望他是加在队尾(栈底)而不是队头(栈首),
所以我们就进行一次首尾互换,将instack中的数据倒腾到outstack,由于栈先进后出的特性,所以这时候原来的栈底在头部,我们直接将元素push进入就到了栈尾(队尾)
然后我们再将outstack中的数据倒腾到instack中即可,这样就又维护了栈原本的顺序

代码(核心)

        while (!st1.empty()) {
            st2.push(st1.top());
            st1.pop();
        }
        st2.push(x);
        while (!st2.empty()) {
            st1.push(st2.top());
            st2.pop();
        }

2.2 双栈的使用(优化)

思路

我们当然发现每次入栈,都要将所有数据从一个栈中移动到另一个栈中两次,这样的工作量实在太大,能否简化?
我们这样思考:
1.对于push操作,我们就正常向instack中push数据(这样是能够正确保存顺序的)
2.对于pop/top操作,如果outstack为空,我们将instack中所有数据倒腾进去,然后栈尾(队首)数据就在头部了,我们就可以取出
如果outstack不为空,为了维护outstack中原有数据顺序,我们并不着急将数据倒腾进去,而是等待栈空后再倒腾,现在outstack中的数据就足够我们操作了

总结:我们很容易发现相对于之前的每读入一个数据就要操作两次栈,这里对于outstack栈空的判断无疑大大减少了操作次数

代码

class MyQueue {
private:
    stack<int> inStack, outStack;
    void in2out() {
        while (!inStack.empty()) {
            outStack.push(inStack.top());
            inStack.pop();
        }
    }

public:
    MyQueue() {}

    void push(int x) { inStack.push(x); }

    int pop() {
        if (outStack.empty()) {
            in2out();
        }
        int x = outStack.top();
        outStack.pop();
        return x;
    }

    int peek() {
        if (outStack.empty()) {
            in2out();
        }
        int x = outStack.top();
        return x;
    }

    bool empty() {
        return inStack.empty() && outStack.empty();
    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

标签:int,outstack,outStack,pop,力扣,用栈,232,push,empty
From: https://www.cnblogs.com/trmbh12/p/18184289

相关文章

  • 力扣刷题笔记-21 合并两个有序链表
    其实不回答就是答案双指针classSolution{publicListNodemergeTwoLists(ListNodelist1,ListNodelist2){ListNodedummy=newListNode(-1);ListNodep=dummy;ListNodep1=list1,p2=list2;while(p1!=null&&p2!=nu......
  • 232自由口转Profinet网关接基恩士扫码枪与PLC通讯案例
     232自由口转Profinet网关(XD-PNR100/300)是一款作用于将232自由口转换为Profinet协议,实现不同网络之间的无缝通信和数据交换。232自由口转Profinet网关具有极高的灵活性和可靠性,为工业控制系统提供了强大的支持。通过将自由口信号转换为Profinet协议,可以轻松实现不同设备之间的......
  • 力扣741 2024.5.6
    原题网址:https://leetcode.cn/problems/cherry-pickup/description/?envType=daily-question&envId=2024-05-06个人难度评价:1800分析:自然的想到分两次dp,第一次dp后修改格点值,然后进行第二次dp。这种做法是错误的:第一次dp的过程中,每次选择都对第二次dp产生后效性。明显从左上到......
  • 232自由口转Profinet网关接AB扫码枪与PLC通讯案例
     232自由口转Profinet网关(XD-PNR100/300),是一种用于将自由协议转换为Profinet协议的设备,可以实现不同网络之间的通信和数据交换。232自由口转Profinet网关高度的灵活性和可靠性使其成为工业自动化领域的重要工具,并将其与Profinet网络无缝集成,实现数据的快速传输和交换。另外23......
  • 力扣1218.最长定差子序列
    题目给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于difference。​ 子序列是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从arr派生出来的序列。解题思路​ 动态规划1.常......
  • 力扣309.买卖股票的最佳时机含冷冻期
    题目给定一个整数数组prices,其中第prices[i]表示第*i*天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票(即冷冻期为1天)。注意:你不能同时参与多笔交易(你必须在再次......
  • hdu 1232通畅工程
    与hdu1213一样简单并查集。点击查看代码importjava.util.Scanner;publicclasshdu1232{ publicstaticvoidmain(String[]args){ //TODO自动生成的方法存根 Scannersc=newScanner(System.in); while(sc.hasNext()){ intn=sc.nextInt(); if(n......
  • 232Modbus转Profinet网关接扫码枪与PLC通讯
    Modbus转Profinet网关(XD-PNR100/300)的主要作用是实现Modbus协议和Profinet协议之间的转换和通信。本案例是用Modbus转Profinet网关接扫码枪与PLC通讯,扫码枪通常通过特定的接口与计算机或其他设备传输数据,而PLC(可编程逻辑控制器)则通常使用Profinet等工业通信协议。要将扫码枪通过......
  • 力扣1235 2024.5.4
    原题网址:https://leetcode.cn/problems/maximum-profit-in-job-scheduling/submissions/529098063/个人难度评价:1600分析:一眼DP,考虑DP顺序,DP递推式与边界十分类似背包,记i为第i段时间,显然有dp[i]=max(dp[i-1],dp[b[i]]+p[i])由此得出递推顺序为按结束时间为第一关键字升序递推......
  • 代码随想录算法训练营第10天 | 栈和队列 232.用栈实现队列 225.用队列实现栈
    leetcode232.用栈实现队列题目232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的......