【基础算法】栈和队列

news2024/11/20 16:25:39

系列综述:
💞目的:本系列是个人整理为了秋招算法的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于代码随想录进行的,每个算法代码参考leetcode高赞回答和其他平台热门博客,其中也可能含有一些的个人思考。
🤭结语:如果有帮到你的地方,就点个赞关注一下呗,谢谢🎈🎄🌷!!!
🌈【C++】秋招&实习面经汇总篇


文章目录

    • 理论基础
      • 基础知识
    • 相关算法题目
      • 232. 用栈实现队列
      • 用队列实现栈
      • 有效的括号
      • 找出与子字符串匹配的主字符串中的字串个数
      • 150. 逆波兰表达式求值
      • 239. 滑动窗口最大值
      • 347. 前 K 个高频元素
    • 参考博客


😊点此到文末惊喜↩︎


理论基础

基础知识

  1. 基本使用
    queue<type> q;
    stack<type> s;
    // 共同函数
    type x;
    sq.empty();// 返回堆栈是否为空的真假值
    sq.push(x);// 向堆栈中压入元素x
    sq.pop();// 弹出堆栈顶元素
    s.top();// 返回栈顶元素
    q.front();// 返回堆顶元素
    
  2. 归纳法写程序
// 健壮性检查:判断函数参数是否符合基本要求
if(形参不符合) return false;
// 初始化:初始化工作变量,即符合要求的第一次循环条件
type var = nullptr/0;// 变量声明一定要初始化
// 循环条件一般是对于容器的遍历
while(!结束条件){
	doing();// 对结果序列操作的函数
	//	工作变量的迭代
}
// 收尾:对于递推末尾条件的处理

相关算法题目

232. 用栈实现队列

  1. 232. 用栈实现队列
    在这里插入图片描述
    class MyQueue {
    public:
        MyQueue() {}
        void push(int x) {
            s1.push(x);
        }
        int pop() {
            if(s2.empty()){
                while(!s1.empty()){
                    s2.push(s1.top());
                    s1.pop();
                }
            }
            int result = s2.top();
            s2.pop();
            return result;
        }
        
        int peek() {
            int res = this->pop(); // 直接使用已有的pop函数
            s2.push(res); // 因为pop函数弹出了元素res,所以再添加回去
            return res;
        }
        
        bool empty() {
            if(s1.empty() && s2.empty())
                return true;
            return false;
        }
    
    private:
        stack<int> s1;
        stack<int> s2;
    };
    

用队列实现栈

  1. 225. 用队列实现栈
    在这里插入图片描述
    class MyStack {
    public:
        queue<int> que;
        /** Initialize your data structure here. */
        MyStack() {
    
        }
        /** Push element x onto stack. */
        void push(int x) {
            que.push(x);
        }
        /** Removes the element on top of the stack and returns that element. */
        int pop() {
            // 初始化
            int size = que.size();
            size--;
            // 循环
            while (size--) { // 将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部
                que.push(que.front());
                que.pop();
            }
            // 收尾
            int result = que.front(); // 此时弹出的元素顺序就是栈的顺序了
            que.pop();
            return result;
        }
    
        /** Get the top element. */
        int top() {
            return que.back();
        }
    
        /** Returns whether the stack is empty. */
        bool empty() {
            return que.empty();
        }
    };
    

有效的括号

  1. 20. 有效的括号
    • 将相反的东西统一
      在这里插入图片描述
 bool isValid(string s) {
 	// 健壮性检查
    if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求
    // 初始化
    stack<char> st;
    // 循环迭代
    for (int i = 0; i < s.size(); i++) {
    	// 将相反的东西统一
	    if (s[i] == '(') st.push(')');
	    else if (s[i] == '{') st.push('}');
	    else if (s[i] == '[') st.push(']');
	    // 开始匹配:不同或者为空则false,相同则弹出
	    else if (st.empty() || st.top() != s[i]) return false;
	    else st.pop(); 
       }
       return st.empty();
   }


找出与子字符串匹配的主字符串中的字串个数

  1. 20. 有效的括号
    • 定义同时必须要初始化
    • 容器反转:reverse (container.begin(), container.end());
    • 栈中元素的遍历,先缓存st.top(),再st.pop()。
    string removeDuplicates(string S) {
        stack<char> st;
        for (char s : S) {
            if (st.empty() || s != st.top()) {
                st.push(s);
            } else {
                st.pop();
            }
        }
        string result = "";// 定义同时必须初始化
        // 遍历栈中元素
        while (!st.empty()) { 
            result += st.top();
            st.pop();
        }
        // 容器反转
        reverse (result.begin(), result.end());
        return result;
    }
    

150. 逆波兰表达式求值

  1. 150. 逆波兰表达式求值

    • string类型转换成int类型:atoi(str.c_str())在这里插入图片描述
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        int n = 0;
        for(const auto &i : tokens){
            char c = i[0];
            if(c >='0' &&  c <= '9' || i.size() > 1){
                n = atoi(i.c_str());
                st.push(n);
            }else if(c == '+'){
                int a = st.top();
                st.pop();
                int b = st.top();
                st.pop();
                st.push(a+b);
            }else if(c == '-'){
                int a = st.top();
                st.pop();
                int b = st.top();
                st.pop();
                st.push(b-a);
            }else if(c == '*'){
                int a = st.top();
                st.pop();
                int b = st.top();
                st.pop();
                st.push(a*b);
            }else if(c == '/'){
                int a = st.top();
                st.pop();
                int b = st.top();
                st.pop();
                st.push(b/a);
                cout << a << " "<< b;
            }
        }
        return st.top();
    }
    

239. 滑动窗口最大值

  1. 239. 滑动窗口最大值
    在这里插入图片描述
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int>q; //双端队列
        vector<int>res;
        for(int i = 0; i < nums.size(); i++){
            while(q.size() &&  i - k + 1 > q.front())  q.pop_front(); //判断队头是否在滑动窗口范围内
            while(q.size() && nums[i] >= nums[q.back()]) q.pop_back();//维护单调递减队列
            q.push_back(i); //将当前元素插入队尾
            if(i >= k - 1)  res.push_back(nums[q.front()]); //滑动窗口的元素达到了k个,才可以将其加入答案数组中
        }
        return res;
    }
    
    

347. 前 K 个高频元素

  1. 347. 前 K 个高频元素
    • 优先队列的使用
    vector<int> topKFrequent(vector<int>& nums, int k) {
        //1.map记录元素出现的次数
        unordered_map<int,int>map;//两个int分别是元素和出现的次数
         for(auto& c:nums){
             map[c]++;
         }
        //2.利用优先队列,将出现次数排序
        //自定义优先队列的比较方式,小顶堆
        struct myComparison{
            bool operator()(pair<int,int>&p1,pair<int,int>&p2){
                return p1.second>p2.second;//小顶堆是大于号
            }
        };
        //创建优先队列
        priority_queue<pair<int,int>,vector<pair<int,int>>,myComparison> q;
        //遍历map中的元素
        //1.管他是啥,先入队列,队列会自己排序将他放在合适的位置
        //2.若队列元素个数超过k,则将栈顶元素出栈(栈顶元素一定是最小的那个)
        for(auto& a:map){
            q.push(a);
            if(q.size()>k){
               q.pop(); 
            }
        }
        //将结果导出
        vector<int>res;
        while(!q.empty()){
            res.emplace_back(q.top().first);
            q.pop();
        }
        return res;
    
    }
    


少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
不如点赞·收藏·关注一波


🚩点此跳转到首行↩︎

参考博客

  1. leetcode二分查找
  2. 代码随想录
  3. 二分查找算法详解
  4. 待定引用
  5. 待定引用
  6. 待定引用
  7. 待定引用
  8. 待定引用

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

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

相关文章

手写axios源码系列二:创建axios函数对象

文章目录 一、模块化目录介绍二、创建 axios 函数对象1、创建 axios.js 文件2、创建 defaults.js 文件3、创建 _Axios.js 文件4、总结 当前篇章正式进入手写 axios 源码系列&#xff0c;我们要真枪实弹的开始写代码了。 因为 axios 源码的代码量比较庞大&#xff0c;所以我们这…

Xilinx FPGA下如何加快QSPI Flash加载速度

1. 首先&#xff0c;不同型号的FPGA对外部QSPI Flash支持的最高频率是不一样的。XC6SLX45支持的最高频率仅为26MHz&#xff0c; 而XC7K325T支持的最高频率高达66MHz。 所以&#xff0c;当我们添加 set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design] 的时候&…

特征选择算法 | Matlab实现基于互信息特征选择算法的分类数据特征选择 MI

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab实现基于互信息特征选择算法的分类数据特征选择 MI 部分源码 %

【1105. 填充书架】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定一个数组 books &#xff0c;其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先…

题目3180:蓝桥杯2023年第十四届省赛真题-互质数的个数======及探讨互质专题

原题链接 https://www.dotcpp.com/oj/problem3162.html 想直接看题解的&#xff0c;跳转到第三次尝试即可。 已AC。 解析&#xff1a; &#xff08;1&#xff09;首先大家要知道什么叫互质&#xff1a; 以及它们的性质&#xff1a; 欧拉函数 在数论中&#xff0c;对正整…

世界读书日|这些值得程序员反复阅读的经典书

2023年是第28个世界读书日&#xff0c;每年的这个时候&#xff0c;小编都会准备一份书单与您分享。 与经典同行&#xff0c;伴书香成长。小编今天推荐一份值得程序员反复阅读的经典书。 1、浪潮之巅 第四版 这不只是一部科技产业发展历史集…… 更是在这个智能时代&#xff…

【远程工具】- MobaXterm 的下载、安装、使用、配置【Telnet/ssh/Serial】

一、MobaXterm 概述 在远程终端工具中&#xff0c;secureCrt 和 XShell 是两款比较有名的远程工具&#xff0c;但这两款软件现在都是收费的&#xff0c;有些公司不允许破解使用。今天就推荐一款免费的、免安装的、功能丰富的远程终端软件–MobaXterm。 MobaXterm是由Mobatek开…

JavaScript概述三(循环结构+BOM浏览器对象模型+JSON对象)

1.循环结构 1.1 普通循环(for循环,while循环,do……while循环) JavaScript中的普通循环和Java中的普通循环基本类似&#xff0c;此处以for循环为例&#xff0c;while和do……while便不再赘述。 <script type"text/javascript">var ary1new Array(1,false,嘿嘿…

Redis队列Stream、Redis多线程详解(三)

Redis中的线程和IO模型 什么是Reactor模式 &#xff1f; “反应”器名字中”反应“的由来&#xff1a; “反应”即“倒置”&#xff0c;“控制逆转”,具体事件处理程序不调用反应器&#xff0c;而向反应器注册一个事件处理器&#xff0c;表示自己对某些事件感兴趣&#xff0…

CTA进网测试《5G消息 终端测试方法》标准依据:YDT 3958-2021

GB 21288-2022 强制国标要求变化​ 与GB 21288-2007相比&#xff0c; 新国标主要有以下变化&#xff1a; 1. 增加职业暴露定义&#xff1a; 2. 增加吸收功率密度定义&#xff1a; 3. 增加不同频率、不同人体部位适用的暴露限值&#xff1a; 4. 增加产品说明书的注释&#xff1a…

ArcGIS Pro用户界面

目录 1 功能区 1.1 快速访问工具栏 1.2 自定义快速访问工具栏 1.3 自定义功能区选项 1.3.1 添加组和命令 1.3.2 添加新选项卡 2 视图 3 用户界面排列 ​编辑 4 窗格 4.1 内容窗格 4.2 目录窗格 4.3 目录视图&#xff08;类似ArcCatalog&#xff09; 4.4 浏览对话框…

注册表取证

目录 操作系统安装时间 计算机名称 本地用户 最后登录的用户 当前登录用户 U盘序列号 USB挂载的盘符 卷标名称 安装的程序 ​编辑卸载的程序 最近使用的文件 最近运行的命令行 操作系统安装时间 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion…

无需代码!新人可操作!分享20个可视化大屏(内附下载)

做前端开发的各位&#xff0c;大都知晓老板钟爱的可视化大屏—清晰、便捷、撑排面&#xff0c;轻轻松松打破数据孤岛等一系列问题。我真的深有体会&#xff0c;前些天&#xff0c;老板去人家公司开会&#xff0c;回来就把这大屏安排上了。之前就认为大屏也不过是面子工程&#…

03 - 大学生如何使用GPT

大学生如何使用GPT提高学习效率 一、引言 在当今的高速发展的信息时代&#xff0c;大学生面临着越来越多的学习挑战。作为一种先进的人工智能技术&#xff0c;GPT为大学生提供了一种强大的学习工具。本文将介绍大学生在不同场景中如何使用GPT来提高学习效率&#xff0c;并给出…

「区间DP-步入」凸多边形的划分

凸多边形的划分 题目描述 给定一个具有N个顶点的凸多边形&#xff0c;将顶点从1至N标号&#xff0c;每个顶点的权值都是一个正整数。将这个凸多边形划分成N-2个互不相交的三角形&#xff0c;试求这些三角形顶点的权值乘积和至少为多少。 输入描述 输入第一行为顶点数N第二行…

云智慧陆兴海:统一运维体系为数字政府建设保驾护航

2023年4月6日至7日&#xff0c;由长春市人民政府、吉林省政务服务和数字化建设管理局主办的《2023长春数字经济发展论坛》在长春隆重举行。 本次论坛旨在探讨数字经济的理论创新、实践探索和发展路径&#xff0c;推动长春市乃至吉林省的数字化转型和高质量发展。第十二届全国政…

无源滤波器为什么能滤波?

滤波器能够滤波的本质是利用构造特定的阻抗特性引起反射和损耗来实现对频率的选择。 如果从能量守恒的角度来讲&#xff0c;被抑制掉的信号去哪里了&#xff1f;​ 我们先看一下基本电路原理&#xff0c;上图中&#xff0c;负载接收的功率为 我们知道&#xff0c;最大功率传输…

ChatGPT: 从GPT-3.5到GPT-4,探索语言模型的演进之路

ChatGPT: 从GPT-3.5到GPT-4&#xff0c;探索语言模型的演进之路 引言 人工智能语言模型的演进 随着人工智能的快速发展&#xff0c;语言模型作为自然语言处理领域的一项重要技术也在不断演进。从最初的基于规则的系统&#xff0c;到基于统计的模型&#xff0c;再到近年来的深度…

【Scala入门】scala基础语法:to和until,if-else和for循环,while循环

目录&#xff1a; 【Scala入门】Scala下载及安装&#xff08;Windows&#xff09;以及Idea创建第一个scala项目_水w的博客-CSDN博客 【Scala入门】scala基础语法&#xff1a;类和对象&#xff0c;变量和常量_水w的博客-CSDN博客 目录 2.4 数据类型 2.5 to和until&#xff0c;…

破防了,这才是机房运维的高效方法

在云计算、5G等新业务野蛮生长的催化下&#xff0c;机房规模与容量也呈倍速扩张。机房安全是业务发展的底座。提升机房设备安全和管理效率&#xff0c;避免人为因素导致的事故发生&#xff0c;是机房运维的必要前提。 安全生产重于泰山&#xff0c;除了日常的科学防护&#xf…