当前位置: 首页 > news >正文

用栈实现队列 用队列实现栈

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

push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。

#include <bits/stdc++.h>
using namespace std;
class MyQueue
{
   public:
    stack<int> stIn;
    stack<int> stOut;
    MyQueue(){}
    void push(int x)
    {
        stIn.push(x);
    }
    int pop()
    {
        if(stOut.empty())
        {
            while(!stIn.empty())
            {
                stOut.push(stIn.top());
                stIn.pop();
            }
            
        }
        int result=stOut.top();
            stOut.pop();
            return result;
    }
    int peak()
    {
        int res=this->pop();
        stOut.push(res);
        return res;
    }
    bool empty()
    {
        return stIn.empty()&&stOut.empty();
    }
    
};
int main()
{
    MyQueue q;
    q.push(1);
    q.push(2);
    q.push(3);
    cout<<q.peak()<<endl;
    cout<<q.pop()<<endl;
    q.push(4);
    q.push(6);
    q.pop();
    while(!q.empty())
    {
        cout<<q.pop()<<" ";
    }
    cout<<endl;
    cout<<(q.empty()?"是":"否");
    return 0;
}
 

思路:在这里我们·要用栈来实现队列的操作,首先我们先来思考,队列遵循FIFO(先进先出),而栈遵循FILO(先进后出),两者的元素进出顺序可谓是截然不同,如何才能实现呢,这时我们可以想到用2个栈,假设有一个队列,有三个元素1,2,3按顺序进入队列,出去时的顺序仍然是1,2,3,同时有2个栈stIn和stOut,元素先按顺序进入到stIn,然后出来,但是顺序反过来了,变成了3,2,1,这是继续进入到stOut中,当它们再次出栈时,顺序就恢复成了1,2,3,这不就正好是我们想要的结果吗。

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

  • push(x) -- 元素 x 入栈
  • pop() -- 移除栈顶元素
  • top() -- 获取栈顶元素
  • empty() -- 返回栈是否为空

#include <bits/stdc++.h>
using namespace std;
class Stack{
    public:
    Stack(){}
    queue<int> que;
    void push(int x)
    {
        que.push(x);
    }
    int pop()
    {
        int size=que.size();
        size--;
        while(size--)
        {
            que.push(que.front());
            que.pop();
        }
        int result=que.front();
        que.pop();
        return result;
    }
    int top()
    {
        return que.back();
    }
   bool empty()
   {
       return que.empty();
   }
};
int main()
{
    Stack st;
    st.push(1);
    st.push(2);
    st.push(3);
    cout<<st.top()<<endl;
    cout<<st.pop()<<endl;
    while(!st.empty())
    {
        cout<<st.pop()<<" ";
    }
    cout<<endl;
    cout<<(st.empty()?"Yes":"No");
    return 0;
 } 

 思路:在这里我们要用队列实现栈,有的人想当然的就用2个队列来实现,其实也是可以的,但是和1个队列来实现栈操作比起还是显得麻烦了,为什么只需要一个队列就可以呢,因为队列两端与栈两端不同,它两端都不封闭。假设有3个元素1,2,3,按顺序进入到栈,输出时顺序应该为3,2,1,当1,2,3进入到队列时为了让输出的首个元素也为3,我们只能让其余不是3的元素让路,那么我们就要将其弹出,并且回到该队列中,那不就是又让它们从队列入口端进入了吗,这样一来就实现了我们想达到的效果。

另外,其实我们仔细看一下两者栈的第一个元素不就是队列的入口端的第一个元素吗,因此取栈顶元素就是取队列入口端的第一个元素。
 

相关文章:

  • 《Windows 文件命名规则与 Python 日志文件生成技巧》
  • . 从理论到实践:小红书、京东如何玩转大模型
  • Go Ebiten小游戏开发:俄罗斯方块
  • 【Linux网络(一)】初识网络
  • 使用外挂工具,在教师资格面试抽题系统中自动填入身份证号
  • git文件过大导致gitea仓库镜像推送失败问题解决(push failed: context deadline exceeded)
  • ragflow-组件可视化工具 es默认用户名elastic
  • git pull报错
  • 【AI大模型智能应用】Deepseek生成测试用例
  • Redis分布式锁
  • [Java]使用java进行JDBC编程
  • 大规模语言模型的涌现能力
  • linux和windows之间的复制
  • AI+Python机器学习小项目教程(数据分类)
  • JAVA面试_进阶部分_正确使用 Volatile 变量
  • Web Workers 客户端 + 服务端应用
  • Python编程学习13条Python2.x和3.x的区别?
  • 【odoo17】odoo前端视图的结构分析及新增视图类型的实现
  • 【从零开始学习计算机科学】操作系统(一)什么是操作系统?操作系统的功能是什么
  • 案例1_1:Proteus点亮8个蓝色LED灯
  • 做代理哪个网站靠谱吗/bt磁力搜索引擎在线
  • 网站建设淄博佳铉网络/泰安网络推广培训
  • 厦门网站建设seo/网站建设平台
  • 做网站的数据库的设计/营销策划与运营公司
  • 怎么做网站描述/关键词优化案例
  • 网站整体营销方案/百度人工客服在线咨询电话