leetcode_栈与队列

news2024/11/19 13:28:25

栈与队列

  • 栈与队列理论基础
  • 232.用栈实现队列
  • 225.用队列实现栈
  • 20.有效的括号
  • 1047.删除字符串中的所有相邻重复项
  • 150.逆波兰表达式求值
  • 239.滑动窗口最大值
  • 347.前k个高频元素
  • 栈与队列总结

栈与队列理论基础

栈与队列理论基础

232.用栈实现队列

力扣题目链接

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 res = stOut.top();
        stOut.pop();
        return res;
    }
    
    int peek() {
        if(stOut.empty()){
            while(!stIn.empty()){
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        int res = stOut.top();
        return res;
    }
    
    bool empty() {
        if(stOut.empty() && stIn.empty()){
            return true;
        }
        else{
            return false;
        }

    }
};

/**
 * 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();
 */

225.用队列实现栈

力扣题目链接

C++deque的基本操作:

总体思路:deq2当deq1的备份使用,每次pop(),或者top(),都把deq1中的元素都移到deq2中,只给deq1留下一个元素,pop()或者top()结束后再把deq2中的元素移回来。

class MyStack {
public:
    deque<int> deq1;
    deque<int> deq2;
    MyStack() {

    }
    
    void push(int x) {
        deq1.push_back(x);
    }
    
    int pop() {
        if(!deq1.empty()){
            while(deq1.size()>1){
                deq2.push_back(deq1.front());
                deq1.pop_front();
            }
        }
        int res = deq1.front();
        deq1.pop_front();
        while(!deq2.empty()){
            deq1.push_back(deq2.front());
            deq2.pop_front();
        }
        return res;
    }
    
    int top() {
        if(!deq1.empty()){
            while(deq1.size()>1){
                deq2.push_back(deq1.front());
                deq1.pop_front();
            }
        }
        int res = deq1.front();
        deq2.push_back(res);
        deq1.pop_front();
        while(!deq2.empty()){
            deq1.push_back(deq2.front());
            deq2.pop_front();
        }
        return res;
    }
    
    bool empty() {
        return deq1.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();
 */

20.有效的括号

力扣题目链接

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        for (auto str : s)
        {
            switch (str) {
                case '(':
                case '{':
                case '[':
                    if (str == '(') st.push(')');
                    else if (str == '{') st.push('}');
                    else st.push(']');
                    break;
                case ')':
                case '}':
                case ']':
                    if (st.empty()) {
                        return false;
                    }
                    if (str != st.top()) {
                        return false;
                    }
                    else {
                        st.pop();
                        break;
                    }
            }
        }
        if (st.empty()) return true;
        else return false;
    }
};

1047.删除字符串中的所有相邻重复项

力扣题目链接

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> st;
        string res;
        for(auto str:s){
            if(st.empty()){
                st.push(str);
            }
            else{
                if(str==st.top()){
                    st.pop();
                }
                else{
                    st.push(str);
                }
            }
        }
        if(st.empty()){
            return "";
        }
        else{
            while(!st.empty()){
                res+=st.top();
                st.pop();
            }
            reverse(res.begin(),res.end());
            return res;
        }
    }
};

150.逆波兰表达式求值

力扣题目链接

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> st;
        for(int i =0;i<tokens.size();i++){
            if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
                long long num1 = st.top();
                st.pop();
                long long num2 = st.top();
                st.pop();
                if(tokens[i]=="+") st.push(num2+num1);
                else if(tokens[i]=="-") st.push(num2-num1);
                else if(tokens[i]=="*") st.push(num2*num1);
                else st.push(num2/num1);
            }
            else{
                st.push(stoll(tokens[i]));
            }
        }
        int res = st.top();
        st.pop();
        return res;
    }
};

239.滑动窗口最大值

力扣题目链接
单调队列≠对窗口里的元素进行实时排序

单调队列设计思想:

  1. pop(val):如果窗口元素val的值等于队列出口的元素的值,则弹出队列出口的元素的值,否则不进行任何操作
  2. push(val):如果窗口元素val的值大于队列入口元素的值,则弹出队列入口的元素的值,一直到窗口元素的值小于等于队列入口的元素。
  3. front():返回队列出口的元素的值。
class Solution {
private:
    class Myqueue {
    public:
        deque<int> deq;
        void pop(int val) {
            if (!deq.empty() && deq.front() == val) {
                deq.pop_front();
            }
        }
        void push(int val) {
            while (!deq.empty() && val > deq.back()) {
                deq.pop_back();
            }
            deq.push_back(val);  
        }
        int front() {
            return deq.front();
        }
    };
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        Myqueue mq;
        vector<int> res;
        for (int i = 0; i < k; i++) {
            mq.push(nums[i]);
        }
        res.push_back(mq.front());
        for (int i = k; i < nums.size(); i++)
        {
            mq.pop(nums[i-k]);
            mq.push(nums[i]);
            res.push_back(mq.front());
        }
        return res;
    }
};

347.前k个高频元素

力扣题目链接
C++priority_queue的使用方法
优先级队列:priority_queue容器适配器模拟的也是队列这种存储结构,即使用此容器适配器存储元素只能从一端进,从另一端出,且每次只能访问队列中的队头元素,和队尾元素。但优先级队列遵循的原则不是先入先出,而是先入优先级大的出。

  1. 大顶堆:最大的元素在堆顶
    • 大顶堆的排序规则:bool operator()(const T &_lhs,const T &_rhs) const{ return _lhs<_rhs;}
    • 把大元素放到右面也就是堆顶,也就是队列要pop的地方。
  2. 小顶堆:最小的元素在堆顶
    • 小顶堆的排序规则:bool operator()(const T &_lhs,const T &_rhs) const{ return _lhs>_rhs;}
    • 把小元素放到右面也就是堆顶,也就是队列要pop的地方。

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    class cmp {
    public:
        bool operator()(pair<int, int> lhs, pair<int, int>rhs) {
            return lhs.second > rhs.second;
        }
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> umap;
        vector<int> res;
        for (int i = 0; i < nums.size(); i++) {
            umap[nums[i]]++;
        }
        priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> prq;
        for (auto iter = umap.begin(); iter != umap.end(); iter++)
        {
            int a = iter->first;
            int b = iter->second;
            prq.push({a,b});   // prq.push(pair<int,int>(a,b))  or prq.push(*iter)
            if (prq.size() > k)
            {
                prq.pop();
            }
        }
        while (!prq.empty()) {
            auto ans = prq.top();
            res.push_back(ans.first);
            prq.pop();
        }
        return res;
    }
};

栈与队列总结

栈与队列总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cadence PCB仿真使用Allegro PCB SI通过导入工艺文件配置层叠结构的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI通过导入工艺文件配置层叠结构的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则…

【JavaScript】数组常用方法

冲突数组常用方法&#xff1a; 注&#xff1a; 以下方法都会对原数组进行改变&#xff1a; push&#xff1a;向数组后面追加元素&#xff0c;返回值是追加后的数组长度 pop&#xff1a;从数组后面删除元素&#xff0c;返回值是删除的元素内容 unshift:在数组前面添加元素&am…

CMMI之系统设计

系统设计&#xff08;System Design, SD&#xff09;是指设计软件系统的体系结构、用户界面、数据库、模块等&#xff0c;从而在需求与代码之间建立桥梁&#xff0c;指导开发人员去实现能满足用户需求的软件产品。系统设计过程域是SPP模型的重要组成部分。本规范阐述了系统设计…

第一章 Flink简介

Flink 系列教程传送门 第一章 Flink 简介 第二章 Flink 环境部署 第三章 Flink DataStream API 第四章 Flink 窗口和水位线 第五章 Flink Table API&SQL 第六章 新闻热搜实时分析系统 前言 流计算产品实时性有两个非常重要的实时性设计因素&#xff0c;一个是待计算…

文档智能(一):基于OpenCV的文档图像校正

文档智能(一)&#xff1a;基于OpenCV的文档图像校正 发表时间&#xff1a; 2023年1月7日创作地点&#xff1a;湖北省武汉市作者&#xff1a;ixy_com&[Aneerban Chakraborty]封面图片来源&#xff1a;DocTr 本文关键词&#xff1a;文档智能、文档图像校正、OpenCV、形态…

从零实现Dooring低代码印章组件

上一篇文章和大家分享了低代码平台组件间通信方案的几种实现:低代码平台组件间通信方案复盘今天继续和大家分享一下比较有意思的可视化印章组件的实现.你将收获低代码组件的基本设计模式印章组件的设计原理(canvas相关)如何快速将任意组件集成到低代码平台正文低代码组件的基本…

雷鸟X2:开启可量产全彩MicroLED光波导AR眼镜新起点

从最近的AR眼镜新品来看&#xff0c;采用MicroLED光波导方案已经成为了明显的趋势&#xff0c;可见业内对于光学的大方向还是非常统一的。不仅如此&#xff0c;各个厂商都拿出自己最优的方案来进行探索和验证&#xff0c;比如有的看重“极轻”、有的看重“视觉”、有的看重“价…

使用Jenkins一键打包部署 SpringBoot应用

一般而言&#xff0c;一个项目部署的由&#xff1a;拉取代码->构建->测试->打包->部署等过程组成&#xff0c;如果我们经常需要部署项目&#xff0c;特别是在微服务时代&#xff0c;服务特别多的情况下&#xff0c;不停的测试打包部署&#xff0c;那估计得有个人一…

数学:一夜读罢头飞雪

文章目录引子代数&#xff0c;几何与分析数学之美微积分形式的统一之美伽罗华群论的深刻之美几何的形体之美公理与定理集合论的公理欧几里得几何公理算术公理实数系的公理系统数学攀登的路径数学的符号系统希腊字母表物理与数学推荐的数学读物参考链接引子 贺新郎读史 人猿相揖…

【阶段二】Python数据分析数据可视化工具使用05篇:统计直方图、面积图与箱型图

本篇的思维导图: 统计直方图 统计直方图(histogram)形状类似柱形图,却有着与柱形图完全不同的含义。统计直方图涉及统计学的概念,首先要从数据中找出它的最大值和最小值,然后确定一个区间,使其包含全部测量数据,将区间分成若干个小区间,统计测量结果出现在各…

详细讲解Linux PCI驱动框架分析

说明&#xff1a; Kernel版本&#xff1a;4.14 ARM64处理器 使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 从本文开始&#xff0c;将会针对PCIe专题来展开&#xff0c;涉及的内容包括&#xff1a; PCI/PCIe总线硬件&#xff1b; Linux PCI驱动核心框…

通俗理解Platt scaling/Platt缩放/普拉特缩放

一、引言 最近在读论文的时候接触到Platt scaling&#xff0c;有点不理解这个概念。然后好奇心比较重&#xff0c;就看了一些科普&#xff0c;并追根溯源调查了一下Platt scaling。最终搞懂了这个概念&#xff0c;写个博客记录一下。中文翻译有看到&#xff1a;普拉特缩放&…

通信原理与MATLAB(十一):QAM的调制解调

目录1.QAM的调制原理2.QAM的解调原理3.QAM代码4.结果图5.特点1.QAM的调制原理 QAM调制原理如下图所示&#xff0c;基带码元波形经过串并转换分成I、Q两路&#xff0c;然后再经过电平转换(00转换成-1,01转换成-3,10转换成1,11转换成3)&#xff0c;再与对应的载波相乘&#xff0…

scMDC:针对单细胞多模态数据进行聚类

目录摘要引言背景介绍单细胞数据聚类方法回顾ZINBscMDC摘要 单细胞多模态测序技术的发展是为了在同一细胞中同时分析不同模态的数据&#xff0c;它为在单细胞水平上联合分析多模态数据从而识别不同细胞类型提供了一个独特的机会。正确的聚类结果对于下游复杂生物功能研究至关重…

JavaEE多线程-认识多线程

目录一、认识操作系统二、认识进程三、内存管理四、什么是线程(Thread)&#xff1f;五、为什么要有线程&#xff1f;六、进程和线程的关系一、认识操作系统 我们需要简单了解一下操作系统。 操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织…

【Python】sklearn机器学习之DBSCAN聚类

文章目录基本原理测试构造函数基本原理 DBSCAN算法是比较经典的聚类算法了&#xff0c;除了sklearn之外&#xff0c;open3d这种常用的点云模块也提供了DBSCAN算法的实现&#xff0c;例如Open3d数据滤波和点云分割。 和其他聚类算法相比&#xff0c;DBSCAN存在一种去中心化的特…

六、Gtk4-Widgets (3)

1 Open 信号 1.1 G_APPLICATION_HANDLES_OPEN flag 在上一节中&#xff0c;我们使用GtkTextView、GtkTextBuffer和GtkScrolledWindow创建了一个非常简单的编辑器。我们将为程序添加文件读取功能&#xff0c;并将其改进为文件查看器。 要给出文件名&#xff0c;最简单的方法是…

(软考)系统架构师大纲

考试要求&#xff1a; 掌握计算机硬软件与网络的基础知识;熟悉信息系统开发过程;理解信息系统开发标准、常用信息技术标准;熟悉主流的中间件和应用服务器平台;掌握软件系统建模、系统架构设计基本技术;熟练掌握信息安全技术、安全策略、安全管理知识;了解信息化、信息技术有关…

使用Vite搭建vue3+TS项目

vite简介 vite 是一个基于 Vue3 单文件组件的非打包开发服务器&#xff0c;它具有快速的冷启动&#xff0c;不需要等待打包操作&#xff1b;并且官网说是下一代的前端构建工具。 初始化项目 npm init vitelatest1.输入项目名称 2.选择Vue 3.选择TS 4.启动项目 5.项目启…

【阶段三】Python机器学习07篇:模型评估函数介绍(回归模型)

本篇的思维导图: 模型评估函数介绍(回归模型) 绝对误差与相对误差: 设Y表示实际值, 表示预测值,则称E为绝对误差(Absolute Error),计算公式如式所示: e为相对误差(Relative Error),计算公式如式所示: