栈和队列的互相实现

标签: 算法  数据结构    队列

栈实现队列

1. 思路

栈是一种存放元素有后进先出特性的数据结构。利用栈后进先出的特性,那么用两个栈,就可以把出栈的元素顺序变成我们入栈的元素顺序。

image-20200720110734651

这样就可以用两个栈来翻转模拟队列先进先出。但是还有一个问题,这例子是一次性全部入栈,一次性全部出栈。如果是入栈-出栈-入栈这种操作要怎么处理。

前面已经知道了可以把一个栈的数据放到另一个栈中翻转来模拟队列的先进先出。出栈的那个栈肯定是不能放我们刚入队的数据的,这样会破坏元素的顺序。所有我们要一个栈用于模拟入队操作,另一个栈模拟出队操作。出队的栈一但空了,就去入队栈拿数据,这样就可以实现队列了。

2. 代码

class MyQueue {
public:
    stack<int> s1, s2;
    // s1 push
    // s2 pop
    
    MyQueue() {
    }
    
    void push(int x) {
        s1.push(x);
    }
    
    int pop() {
        int top;
        if (!s2.empty()) {
            top = s2.top();
            s2.pop();
        } else {
            while (!s1.empty()) {
                s2.push(s1.top());
                s1.pop();
            }
            top = s2.top();
            s2.pop();
        }
        return top;
    }
    
    int peek() {
        if (s2.empty()) {
            while (!s1.empty()) {
                s2.push(s1.top());
                s1.pop();
            }
        }
        return s2.top();
    }
    
    bool empty() {
        return s1.empty() && s2.empty();
    }
};

队列实现栈

1. 思路

首先想到的是双端队列,可以很容易的实现栈操作。这个太简单了,用单向队列实现看看。

单向队列的特点是先进的元素先出,只能在一端入队,另一端出队。用一个队列肯定不行,用两个元素顺序也不会变,这咋整???

机智的你肯定想到办法了。在这队列里,出栈的元素肯定是最后一个元素。那么可以把队列挪到另一个队列中去,然后只留一个元素在原来队列,这样这个元素就是出栈的第一个元素了。每次出栈都要挪一次队列。

这样代码就很容易了。

2. 代码

class MyStack {
public:
    queue<int> q1, q2;
    
    MyStack() {
    }
    
    void push(int x) {
        // 哪个队列有元素就往哪个放
        if (!q1.empty()) {
            q1.push(x);
        } else if (!q2.empty()) {
            q2.push(x);
        } else {
            q1.push(x);
        }
    }
    
    int pop() {
        int p;
        if (!q1.empty()) { // 放元素的队列
            while (q1.size() != 1) {
                q2.push(q1.front());
                q1.pop();
            }
            // 剩下一个元素
            p = q1.front();
            q1.pop();
        } else {
            while (q2.size() != 1) {
                q1.push(q2.front());
                q2.pop();
            }
            p =  q2.front();
            q2.pop();
        }
        return p;
    }
    
    int top() {
        if (!q1.empty()) return q1.back();
        else return q2.back();
    }
    
    bool empty() {
        return q1.empty() && q2.empty();
    }
};
版权声明:本文为Saykuray原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Saykuray/article/details/107460212

智能推荐

css3画圆和椭圆

试一下就知道怎么用了,  画个多来A梦 是用多简单...

raw&assets&sdcard读取mp3文件的方式

Raw方式 assets SDcard 首先需要添加 静态请求权限 动态请求 playMnt的播放方法 如何在模拟器中添加音乐 详细代码参见 点击跳转...

微信小程序封装请求方法wx.request(OBJECT)

小程序写完也一段时间了,最近分享下装逼的技能吧,封装请求方法,不但高大上,而且使用简单。先说说小程序自带的请求吧! wx.request(OBJECT) 参数: 参数名 类型 必填 默认值 说明 url String 是 开发者服务器接口地址 data Object/String/ArrayBuffer 否 请求的参数 header Object 否 设置请求的 header,header 中不能...

【并行计算-CUDA开发】【视频开发】ffmpeg Nvidia硬件加速总结

2017年5月25日 0. 概述 FFmpeg可通过Nvidia的GPU进行加速,其中高层接口是通过Video Codec SDK来实现GPU资源的调用。Video Codec SDK包含完整的的高性能工具、源码及文档,支持,可以运行在Windows和Linux系统之上。从软件上来说,SDK包含两类硬件加速接口,用于编码加速的NVENCODE API和用于解码加速的NVDECODE API(之前被...

HTML简介及部分常用标签

一、HTML简介 1)HTML简介 HTML是⽤于创建⽹⻚的语⾔。我们通过使⽤HTML标记标签创建html⽂档来创建⽹⻚。 HTML代表超⽂ 本标记语⾔。 HTML是⼀种标记语⾔,它具有标记标签的集合。 HTML标签是由尖括号括起来的词,如 , 。标签通常成对出现,例如 和 。 ⼀对中的第⼀个标签是开始标签;第⼆个标签是结束标签。在上⾯的示例中, 是开始标签,⽽ 是结束标签。 我们还可以将开始标签...

猜你喜欢

05:最大值和最小值的差

原题链接 总时间限制:  1000ms  内存限制:  65536kB 描述 输出一个整数序列中最大的数和最小的数的差。 输入 第一行为M,表示整数个数,整数个数不会大于10000; 第二行为M个整数,以空格隔开,每个整数的绝对值不会大于10000。 输出 输出M个数中最大值和最小值的差。 样例输入 样例输出 源码...

java判断奇偶数注意点

如果让我们用java写一个方法来判断一个整数是奇数还是偶数,相信很多人很快能写出来,而其中可能就会有下面这种: 这样写有没有什么问题呢? 初步看,没什么问题,不过,真没问题吗?输入-1试试看: 结果为false诶,难道-1不是奇数?赶紧换成-3在试试,结果还是false。 究竟发生了什么,我们看看-1和-3分别与2求余是什么结果: 结果都是-1,这就要引出java的一个特性了,java求余结果与左...

mac终端使用ssh连接虚拟机(也就是连接远程服务器)

配置host 我们可以借助第三方工具SwitchHosts;SwitchHosts是开源的,可免费下载 本机ip地址是常开状态,我们公司还有一个预发布环境的host需要配置,跟本地配置host是一样的,只是ip不一样。 本地配置host如下图: ssh连接虚拟机 mac终端自带ssh,不需要我们下载任何东西 ps:虚拟机的账号和密码需要公司给你开 直接上命令 这样就连上你的虚拟机了,如下图所示: ...

DBSCAN聚类算法原理

概念 ϵ邻域: 给定点的ϵ为半径的区域 核心点(core points): 如果点p的ϵ邻域内的点数大于minPts,那么p是核心点 直接可达(directly reachable): 核心点p到其ϵ邻域内的所有点是直接可达的。(注意必须是p必须是核心点) 可达(reachable): 如果存在一条路径p1=p,p2,...,pn−1,pn=q,如果对于任意i,pi到pi+1是直接可达...

Web前端三大核心技术-CSS

Web前端三大核心技术-CSS 文章目录 Web前端三大核心技术-CSS CSS概述 CSS引入 CSS选择器 基本选择器 关联选择器 组合选择器 伪元素选择器 Div与Span Div示例 Div与Span区别 Div的边框样式 Div内边框(padding) Div外边框(margin) 两个行内元素的margin: 父子块的margin Div浮动 CSS定位 绝对定位 相对定位 CSS文字...