225. Implement Stack using Queues

本文探讨了如何利用队列的基本操作实现栈的功能,并通过两种方法提供了详细的实现步骤。第一种方法使用两个队列来模拟栈的行为,确保新元素始终位于主队列的头部。第二种方法仅使用一个队列,通过特定的插入顺序确保顶部元素始终位于队列前端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Implement the following operations of a stack using queues.

push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
empty() – Return whether the stack is empty.
Notes:
You must use only standard operations of a queue – which means only push to back, peek/pop from front, size, and is empty operations are valid.
Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue.
You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack).

s思路:
1. 再次说明,世界上的事物是紧密联系的,queue和stack都可以相互实现了!这题不难,应该用两个queue来实现一个stack的功能,也就是说两个queue==一个stack.
2. 两个queue的使用比较有意思,想了一会,发现一定要从最简单的case:只有一个数据,来模拟这个过程,不能随意假设现在里面有多个数据。在程序设计时,一定要从最简单的case入手,去发现规律。比如:我刚开始就想里面有4个数据,就不知道如何往下走,因为这4个数据的排列不是随意假设可以得到的。
3. 现从一个数据开始往queue放,假设两个queue,左边是主,右边是辅,先把1放入主,当放2时,放之前为保证2在主的头部,这样才能模拟stack,需要把主queue中的数据都读出来放在副queue里,所以把1读出,此时主queue空,然后写入2,之后在把副queue中的1再读出写入主queue;当放3的时候,也如法炮制,为保证把3写到主queue的头部,先清空主queue,把主queue的数读出写入副queue,然后把3写入主queue,最后再把副queue中的数据还原到主queue中,结束!此时在主queue中3个数的顺序就是3在顶,2在中间,1在底,这就和stack的特征一致。
这里写图片描述
4. 现在分析,为了用queue模拟stack,首先空间上,需要两个queue,一个主一个副;时间上,当queue里本来就有k个数,要写入新的数时,需要先把k个数读出主queue,再写入副queue,然后写入这个数,之后还要把这k个数读出副queue,同时写入主queue。因此,时间复杂度是o(k),和里面的数的个数成正比。因此,这样做时间空间都不划算!
5. 这么做的意义,在我看来,就是表面这两个一起学习,很多相似很多相反操作的数据结构如何可以联系到一起,也就是说站在某一个角度或者位置,看到这两者是相同的;其次,也看到了思维绝不是无根之木,不能随意从任何地方开始思考,需要从一个元问题入手,而通常元问题,又是问题的边界,在边界的地方,我们总有经验击破问题的barrier,一探问题的本质,所以从边界入手,从元问题入手,是最容易出结果的!
6. 从边界,从元问题入手,说起来容易,做起来还要多练习,不过道理上要先通达,做起来就目标明确,不会走偏,务虚和务实总是交叉进行,不分先后!
7. 看了答案,其实一个queue就够了,只要总原则是每次写完保证这个数在queue头部!看方法2

//方法1: 2个queue
class MyStack {
private:
    queue<int> qq1,qq2;

public:
    /** Initialize your data structure here. */
    MyStack() {

    }

    /** Push element x onto stack. */
    void push(int x) {
        if(!qq1.empty()){
            while(!qq1.empty()){
                int cur=qq1.front();
                qq1.pop();
                qq2.push(cur);    
            }    
        }
        qq1.push(x);
        if(!qq2.empty()){
            while(!qq2.empty()){
                int cur=qq2.front();
                qq2.pop();
                qq1.push(cur);    
            }    
        }
    }

    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int cur=qq1.front();
        qq1.pop();
        return cur;
    }

    /** Get the top element. */
    int top() {
        return qq1.front();
    }

    /** Returns whether the stack is empty. */
    bool empty() {
        return qq1.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();
 */



//方法2: 1个queue足够
class MyStack {
private:
    queue<int> qq;

public:
    /** Initialize your data structure here. */
    MyStack() {

    }

    /** Push element x onto stack. */
    void push(int x) {
        int sz=qq.size();
        qq.push(x);
        while(sz--){
            int cur=qq.front();
            qq.pop();
            qq.push(cur); 
        }
    }

    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int cur=qq.front();
        qq.pop();
        return cur;
    }

    /** Get the top element. */
    int top() {
        return qq.front();
    }

    /** Returns whether the stack is empty. */
    bool empty() {
        return qq.empty();
    }
};
一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值