七、栈与队列(stack and queue)

news2024/11/20 11:39:48

文章目录

  • 一、栈与队列基础
  • 二、例题
    • (一)栈
      • 1.[232. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/description/)
        • (1)思路
        • (2)代码
        • (3)复杂度分析
      • 2.[225. 用队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/description/)
        • (1)思路
        • (2)代码
        • (3)复杂度分析
      • 3.[20.有效的括号](https://leetcode.cn/problems/valid-parentheses/description/)
        • (1)思路
        • (2)代码
        • (3)复杂度分析
      • 4.[1047.删除相邻有效字符 ](https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/)
        • (1)思路
        • (2)代码
        • (3)复杂度分析
      • 6.[150. 逆波兰表达式求值 ](https://leetcode.cn/problems/evaluate-reverse-polish-notation/)
        • (1)思路
        • (2)代码
        • (3)复杂度分析

一、栈与队列基础

队列是先进先出,栈是先进后出。

在这里插入图片描述

栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。

所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。

那么问题来了,STL 中栈是用什么容器实现的?

从下图中可以看出,栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。
在这里插入图片描述
虽然 stack 和 queue 和 priority_queue 中也可以存放元素,但在 STL 中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为 stack 和 queue 和 priority_queue 只是对其他容器的接口进行了包装,STL 中 stack 和 queue 默认使用 deque,而 priority_queue 默认使用 vector。

在这里插入图片描述

二、例题

(一)栈

1.232. 用栈实现队列

(1)思路
(2)代码
class MyQueue {
public:
stack<int> in;
stack<int> out;
    MyQueue() {
        
    }
    
    void push(int x) {
        in.push(x);
    }
    
    int pop() {
        // 只有当out为空的时候,再从in里导入数据(导入in全部数据)
        if (out.empty()) { 
             // 从in导入数据直到in为空
            while (!in.empty()) {
                out.push(in.top());
                in.pop();
            }
        }
        int result = out.top();
        out.pop();
        return result;
    }
    
    int peek() {
        int res = this->pop();
        out.push(res);
        return res;
    }
    
    bool empty() {
         return in.empty() && out.empty();
    }
};

(3)复杂度分析

时间复杂度:push和empty为O(1), pop和peek为O(n)
空间复杂度:O(n)

2.225. 用队列实现栈

(1)思路
(2)代码
(3)复杂度分析

3.20.有效的括号

(1)思路
(2)代码
class Solution {
public:
    bool isValid(string s) {
        if (s.size() % 2 == 1) {
            return false;
        }
        stack<char> t;
        for (auto ch : s) {
            if (ch == '(') { // 
                t.push(')');
            }
            else if (ch == '[') {
                t.push(']');
            }
            else if (ch == '{') {
                t.push('}');
            }
            else if (t.empty() || ch != t.top()) { 
                // 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
                // 第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
                // 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
                return false;
            }
            else {
                t.pop();
            }
        }
       return t.empty();
    }
};
(3)复杂度分析
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

4.1047.删除相邻有效字符

(1)思路

我们在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?

所以就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。

(2)代码
class Solution {
public:
    string removeDuplicates(string s) {
        string result;
        for (char ch : s) {
            if (result.empty() || result.back() != ch) {
                result.push_back(ch);
            }
            else {
                result.pop_back();
            }
        }
        return result;
    }
};
(3)复杂度分析

时间复杂度: O(n)
空间复杂度: O(1),返回值不计空间复杂度

6.150. 逆波兰表达式求值

(1)思路

那么来看一下本题,其实逆波兰表达式相当于是二叉树中的后序遍历。 大家可以把运算符作为中间节点,按照后序遍历的规则画出一个二叉树。

(2)代码
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        // 力扣修改了后台测试数据,需要用longlong
        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);
                if (tokens[i] == "-") st.push(num2 - num1);
                if (tokens[i] == "*") st.push(num2 * num1);
                if (tokens[i] == "/") st.push(num2 / num1);
            } else {
                st.push(stoll(tokens[i]));
            }
        }

        int result = st.top();
        st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事)
        return result;
    }
};

(3)复杂度分析
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

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

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

相关文章

海大校园学习《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

海大校园学习《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

pytorch固定随机数中种子

1、添加到yolov7的utils/general.py文件最下面 import pkg_resources as pkg def check_version(current0.0.0, minimum0.0.0, nameversion , pinnedFalse, hardFalse, verboseFalse):# Check version vs. required versioncurrent, minimum (pkg.parse_version(x) for x in …

【数据结构--八大排序】之归并排序

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

中国社科院与美国杜兰大学完成了我的金融硕士梦

一个人从出生就被赋予着太多的期待&#xff0c;比如爸爸妈妈从小没有完成的梦想&#xff0c;哥哥姐姐失败的课程&#xff0c;为了实现这些期待&#xff0c;人们忙着奋斗、拼搏、追逐&#xff0c;马不停蹄去做有用的事&#xff0c;结交有用的人&#xff0c;不敢虚度半寸光阴&…

第1章 数据结构绪论

1.1 开场白 1.2 你数据结构怎么学的 1.3 数据结构起源 早期人们都把计算机理解为数值计算工具&#xff0c;就是感觉计算机当然是用来计算的&#xff0c;所以计算机解决问题&#xff0c;应该是先从具体问题中抽象出一个适当的数据模型&#xff0c;设计出一个解此数据模型的算…

crypto:丢失的MD5

题目 得到一个md5.py 运行一下&#xff0c;发现报错&#xff0c;修改一下 运行之后又报错 报错原因是算法之前编码 正确的代码为 import hashlib for i in range(32,127):for j in range(32,127):for k in range(32,127):mhashlib.md5()m.update((TASC chr(i) O3RJMV c…

Makerbase SimpleFOC ESP32 例程12 双霍尔电机位置控制

Makerbase SimpleFOC ESP32 例程12 双霍尔电机位置控制 第 1 部分 硬件介绍 1.1 硬件清单 序号品名数量1MKS ESP32 FOC V1.0 主板12LA034-040NN07A 霍尔电机23DC24V电源14USB 线1 硬件清单如下图所示&#xff1a; ESP32 FOC V1.0主板说明书等更多资料请加入企鹅&#xff…

1039 到底买不买

描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串&#xff0c;但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告诉她有多少多余的珠子&#xff1…

对比学习的锚网络和自动生成标签

文章目录 锚网络自动生成标签&#xff08;词组&#xff09; 锚网络 在对比学习&#xff08;Contrastive Learning&#xff09;中&#xff0c;“锚网络”&#xff08;Anchor Network&#xff09;通常是指一个用于生成数据样本的表示的网络。锚网络的主要作用是将输入数据样本转…

链表入门(单链表讲)

链表 1.链表1.1 链表概念及其结构1.2 链表的分类 2.单链表代码实现2.1 单链表的定义2.2 单链表的初始化2.3 单链表的新增结点2.4 单链表的打印2.4 单链表的插入2.4.1 头插2.4.2 尾插2.4.3 任意位置插入 2.5 单链表的删除2.5.1 头删2.5.2 尾删2.5.3 任意位置删除 2.6 单链表的查…

华为网络技术基础笔记

2023-2024 一、9/81.典型拓扑2.分层架构3.流量分析4.网线 二、9/15三、9/19 一、9/8 1.典型拓扑 Topolpgy 拓扑 结构 ①总线型 ②星型 网络 要 有 “ 冗余 ”性。 ③树型 ④环型网络&#xff08;口字型网络&#xff09; ⑤全互联&#xff08;全网状&#xff09; ⑥部分网…

代码随想录 Day7 字符串1 LeetCode T344反转字符串 T541 反转字符串II 151翻转字符串的单词

本文更详细解析来自于:代码随想录 (programmercarl.com) LeetCode T344 反转字符串 链接:344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 题目思路 这题的思路很简单,只需要创建两个指针,一个指向首字母,一个指向末字母,两两进行交换即可,这里我们要说的就是交换,可…

一个比 ping 更强大、更牛逼的命令行工具

晚上好&#xff0c;我的网工朋友。 遇到网络故障的时候&#xff0c;你一般会最先使用哪条命令进行排障&#xff1f; 基本上大家第一个想到的都是Ping吧。 但除了Ping&#xff0c;还有Traceroute、Show、Telnet又或是Clear、Debug等等好用命令&#xff0c;你都用过吗&#xf…

MD5 绕过第二式:数组绕过

文章目录 参考环境强类型比较运算符雾来哈希碰撞目标 王小云院士与白宫密码王小云院士两度破译白宫密码白宫密码亮剑十年磨一剑 雾散曲径通幽WarrningPHP 中的数组与 md5()尝试绕过PHP8 下的致命错误 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火…

正点原子lwIP学习笔记——Jperf测试网速

1. Jperf与iperf简介 iperf是命令行形式的网络性能测试工具&#xff1b;而Jperf就是在iperf的基础上进行UI开发&#xff0c;搭建了界面的图形化网络性能测试工具。 是用来测试TCP/UDP的带宽、延迟抖动和数据包丢失等功能&#xff01; iperf -c server -ip -p server-port -i 1…

解决GC毛刺问题——转转搜索推荐服务JDK17升级实践

解决GC毛刺问题——转转搜索推荐服务JDK17升级实践 1 升级背景2 JDK17简介2.1 新语法简介2.2 新GC算法简介 3 升级过程3.1 升级步骤3.2 遇到问题及解决方法 4 升级效果4.1 整体耗时对比4.2 分节点耗时对比4.3 GC停顿时长对比4.4 堆空间占用对比 5 总结 1 升级背景 随着转转业务…

HTTPS协议概述

HTTPS&#xff08;Hypertext Transfer Protocol over Secure Socket Layer&#xff0c;基于安全套接字层的超文本传输协议&#xff09;&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。即HTTP下加入SSL层&#xff0c;HTTPS的安全基础是SSL&#xff0c;…

C语言入门Day_26 结构体

目录 前言&#xff1a; 1.结构体的定义 2.结构体的使用 3.易错点 4.思维导图 前言&#xff1a; 变量只能表示单一的属性&#xff0c;比如用int去表示一个年龄&#xff0c;用float去表示一个身高或一个体重&#xff0c;一个字符串/字符数组去表示一个性别或一个名字。 …

2023年腾讯云服务器优惠活动整理汇总

腾讯云是腾讯集团倾力打造的云计算品牌&#xff0c;为了吸引更多的用户&#xff0c;腾讯云经常会推出各种各样的优惠活动。本文将为大家整理汇总一些腾讯云服务器的优惠活动&#xff0c;希望能够帮助到需要购买腾讯云服务器的用户。 一、腾讯云服务器优惠券 腾讯云优惠券是腾讯…

创建型设计模式——工厂模式

摘要 本博文主要介绍软件设计模式中工厂模式&#xff0c;其中工厂设计模式的扩展为简单工厂(Simple Factory)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)三种。 一、简单工厂(Simple Factory) 主要分析设计模式 - 简单工厂(Simple Factory)&#xff0c;它把实例…