首页 > 其他分享 >剑指 Offer 09. 用两个栈实现队列 && leetcode225.用队列实现栈

剑指 Offer 09. 用两个栈实现队列 && leetcode225.用队列实现栈

时间:2023-04-13 23:24:25浏览次数:35  
标签:leetcode225 obj Offer 队列 元素 pop que1 int

 剑指 Offer 09. 用两个栈实现队列 

class CQueue {
private:
    stack<int> inStack, outStack;
    void in2out(){
        //这里必须是while循环,如果是if判断,则输出栈日常只有一个值,没有起到先入后出的作用
        while(!inStack.empty()){
            //将输入栈栈顶的元素弹出给输出栈
            outStack.push(inStack.top());
            inStack.pop();
        }
    }
public:
    CQueue() {

    }
    
    void appendTail(int value) {
        inStack.push(value);
    }
    
    int deleteHead() {
        if(outStack.empty()){
            if(inStack.empty()){
                //输入栈输出栈都为空,表明队列中没有元素
                return -1;
            }
            //输出栈没有元素但输入栈有,将输入栈全部元素压入输出栈
            in2out();
        }
        //输出栈弹出栈顶元素
        int value = outStack.top();
        outStack.pop();
        return value;

    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

  leetcode225.用队列实现栈

双队列:

双队列:一个队列用来模拟栈存放数据,另一个辅助队列用来备份数据。每次需要弹出元素的时候,把除了最后一个元素的所有元素弹出存入辅助队列中,等最后一个元素弹出后再把辅助队列的所有临时数据存到主队列中,辅助队列清零。

class MyStack {
private:
    queue<int> que1;
    queue<int> que2;//辅助队列
public:
    MyStack() {

    }
    
    void push(int x) {
        que1.push(x);
    }
    
    int pop() {
        int size = que1.size();
        --size;
        while(size -- ){
            que2.push(que1.front());
            que1.pop();//将que1除了队尾的元素,其他全部放入que2中
        }
        int res = que1.front();//队尾的元素,即栈的栈头
        que1.pop();
        que1 = que2;//将que2中的元素全部赋给que1
        while(!que2.empty()){
            que2.pop();//清空que2
        }
        return res;
    }
    
    int top() {
        return que1.back();
    }
    
    bool empty() {
        return que1.empty();
    }
};

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

单队列

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

class MyStack {
private:
    queue<int> q;
public:
    MyStack() {
        
    }
    
    void push(int x) {
        q.push(x);
    }
    
    int pop() {
        int size = q.size();
        -- size;
        while(size > 0){
            //将队列头部的元素(除了最后一个元素之外) 重新添加到队列尾部
            q.push(q.front());
            q.pop();
            -- size;
        }
        int res =  q.front(); //此时弹出的元素顺序就是栈的顺序了
        q.pop();
        return res;
    }
    
    int top() {
        return q.back();
    }
    
    bool empty() {
        return q.empty();
    }
};

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

 

标签:leetcode225,obj,Offer,队列,元素,pop,que1,int
From: https://www.cnblogs.com/luxiayuai/p/17316924.html

相关文章

  • 剑指 Offer 62. 圆圈中最后剩下的数字
    题目链接:剑指Offer62.圆圈中最后剩下的数字方法:约瑟夫环+倒推解题思路假设我们最好剩余的数字是\(N\)。执行完"删除第三个元素"的操作后,\(N\)在新数组中的位置\(P\)的意义是什么?它表示,在新数组中,\(N\)前面有还有\(P\)个元素。那么,在当前数组中,\(N\)前面一定有......
  • [USACO12MAR]Flowerpot S 单调队列
    [USACO12MAR]FlowerpotStag:单调队列很惭愧,今天发现自己连滑动窗口都不会了,遂做了一些题两滴水的高度之差大于等于D的情况下的最小花盆宽度暴力思路:对于任意两点求水滴高度差是否大于等于D,若大于等于\(D\)则计算最下的两点距离\(w\)但这显然是能过但不完全过,手玩一下样例,是......
  • 华为认证HCIE Datacom培训理论技术学习关于中队列技术
    华为认证HCIEDatacom培训理论技术学习关于中队列技术关注WOLFLAB网络技术实验室,讲师:崔志鹏,杨广成。关注我,每周都会更新,华为认证WOLFLAB网络技术实验室!华为认证HCIE(1) FIFO:先进先出队列,是单队列技术,不会引入额外延迟,延迟只与队列长度有关,不提供任何差分服务。(2) RR:轮询调度,采用轮询......
  • 栈实现队列
    用两个栈实现队列题目链接 思路首先,梳理下栈和队列的概念,如下图栈中所有数据遵循后入先出,而队列是先入先出然后,理解用两个栈模拟出的队列结构最后思考如何用模拟出的队列实现入队,出队,取队头数据和判空操作,这里说一下我的思路入队:入pushst栈出队:将pu......
  • 【剑指 Offer】 39. 数组中出现次数超过一半的数字
    【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例1:输入:[1,2,3,2,2,2,5,4,2]输出:2 限制:1<=数组长度<=50000 来源:力扣(LeetCode)链接:https://leetcode.cn/problems/shu-zu......
  • 【剑指 Offer】 56 - II. 数组中数字出现的次数 II
    【题目】在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例1:输入:nums=[3,4,3,3]输出:4示例2:输入:nums=[9,1,7,9,7,9,7]输出:1 限制:   1<=nums.length<=10000   1<=nums[i]<2^31 来源:力扣(LeetCode)链接:http......
  • 3.【RabbitMQ实战】- 工作队列(Work Queue)
    工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。轮询分发消息......
  • 力扣---剑指 Offer 39. 数组中出现次数超过一半的数字
    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:[1,2,3,2,2,2,5,4,2]输出:2 限制:1<=数组长度<=50000注意:本题与主站169题相同:https://leetcode-cn.com/problems/majority-el......
  • 双向队列from collections import deque
    发音:/dek/ fromcollectionsimportdequedq=deque(range(10),maxlen=10)print(dq)dq.rotate(3)print(dq)dq.rotate(-4)print(dq)dq.appendleft(-1)print(dq)dq.extend([11,22,33])print(dq)dq.extendleft([10,20,30,40])print(dq)  ......
  • 数据结构-->设计循环队列(OJ)
    各位好友,今天我们着重讲解,如何设计出一个循环队列,以及一些大坑如何避免与规避 !!题目如下:本道OJ稍微有些复杂了。可以说,是前面几期的栈与队列的试金石 至于思路,在这里特别强调一下,千万别用--->链表去实现,因为贼恶心!!太难控制,以及不好操作比如,若用链表,那么你在找尾的时候贼难......