代码随想录算法训练营第10天|232.用栈实现队列,225. 用队列实现栈

简介: 代码随想录算法训练营第10天|232.用栈实现队列,225. 用队列实现栈

理论基础

image.png

栈存储结构

又称为堆栈,是一种先入后出的数据结构。c++中的栈常用的接口如下:

  • pop(); 将顶部元素弹出;
  • push(x);将元素x放入栈的顶部;
  • top();返回栈的顶部元素;
  • size(); 返回栈的大小;
  • empty();返回队列是否为空的状态;

队列

image.png

队列存储结构

是一种先入先出的数据结构。c++中队列的常用接口如下:

  • front();返回队列头部元素;
  • back();返回队列尾部元素;
  • pop();将队列头部元素移除;
  • size();返回队列大小;
  • empty();返回队列是否为空的状态;

https://juejin.cn/post/6854573217269415950


232.用栈实现队列

代码:

class MyQueue {
private:
    stack<int> stIn;
    stack<int> stOut;   
public:
    MyQueue() {
    }
    void push(int x) {
        stIn.push(x);
    }
    int pop() {
        while(stOut.empty()){
            while(!stIn.empty()){
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        int val = stOut.top();
        stOut.pop();
        return val;
    }
    int peek() {
        int val = this->pop();
        stOut.push(val);
        return val;
    }
    bool empty() {
        return stIn.empty() && stOut.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();
 */

思路:

题目中队列需要实现的操作有:push(x), pop() , peek() , empty()。

栈只具备先入后出的属性,而队列是先入先出。所以可以利用两个栈来灵活的移动数据(一个用于存储刚push的数据,而一个用于存储需要被弹出的数据。)从而实现队列先入先出的属性。

难点:

pop()的实现是本题的难点所在,需要注意的点是只有当需要stOut为空时才需要将push进的元素全部放入stOut,否则实现的队列结构就不是先入先出了。

总结:

本题不涉及复杂的算法,主要用于认识与了解队列这种数据哦结构。

225. 用队列实现栈

代码:

class MyStack {
private:
    queue<int> queue1;
public:
    MyStack() {
    }
    void push(int x) {
        queue1.push(x);
    }
    int pop() {
        int size = queue1.size()-1;
        while(size--){
            queue1.push(queue1.front());
            queue1.pop();
        }
        int val = queue1.front();
        queue1.pop();
        return val;
    }
    int top() {
        return queue1.back();
    }
    bool empty() {
       return  queue1.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();
 */

思路:

题目栈需要实现的操作有:push(x), pop() , top() , empty()。

同样地,两种数据结构的属性不一样。可以利用队列的先入先出属性循环地遍历插入和弹出数据,从而实现栈所具备的属性。

难点:

本题难点用样的在于pop()的实现。pop()需要弹出并且返回最后一个push的数据。可以循环插入队列头部元素,同时弹出头部元素,一直重复,直到尾部元素被移动到了队列头部。在将元素pop就可以了。

总结:

本题的目的在于了解什么是队列,具备哪些属性。不涉及复杂的算法。


参考资料

代码随想录

栈:C++ stack(STL stack)用法详解

队列:什么是队列,队列及其应用(超详细)

堆:什么是堆?看这一篇就够了! - 掘金

相关文章
|
6天前
|
机器学习/深度学习 算法 API
【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)
【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)
9 0
|
6天前
|
存储 算法
数据结构与算法 栈与队列
数据结构与算法 栈与队列
12 0
数据结构与算法 栈与队列
|
6天前
|
算法 关系型数据库 C语言
卡尔曼滤波简介+ 算法实现代码(转)
卡尔曼滤波简介+ 算法实现代码(转)
20 4
|
6天前
|
运维 算法
基于改进遗传算法的配电网故障定位(matlab代码)
基于改进遗传算法的配电网故障定位(matlab代码)
|
6天前
|
算法 调度
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
|
6天前
|
算法
【免费】基于ADMM算法的多微网电能交互分布式运行策略(matlab代码)
【免费】基于ADMM算法的多微网电能交互分布式运行策略(matlab代码)
|
6天前
|
算法
基于蜣螂优化算法DBO的VMD-KELM光伏发电功率预测(matlab代码+可提供讲解)
基于蜣螂优化算法DBO的VMD-KELM光伏发电功率预测(matlab代码+可提供讲解)
|
6天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
2天前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
21 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
|
4天前
|
算法
MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型
这段内容介绍了一个使用改进的麻雀搜索算法优化CNN-BiLSTM模型进行多输入单输出预测的程序。程序通过融合正余弦和柯西变异提升算法性能,主要优化学习率、正则化参数及BiLSTM的隐层神经元数量。它利用一段简单的风速数据进行演示,对比了改进算法与粒子群、灰狼算法的优化效果。代码包括数据导入、预处理和模型构建部分,并展示了优化前后的效果。建议使用高版本MATLAB运行。