![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
栈和队列
文章平均质量分 70
yuzhang_zy
现在的我不是最好的我,未来的我才是最好的我,每一篇博客都记录着我的成长
展开
-
636 函数的独占时间(栈)
1. 问题描述:有一个单线程 CPU 正在运行一个含有 n 道函数的程序。每道函数都有一个位于0 和 n-1 之间的唯一标识符。函数调用存储在一个调用栈上 :当一个函数调用开始时,它的标识符将会推入栈中。而当一个函数调用结束时,它的标识符将会从栈中弹出。标识符位于栈顶的函数是当前正在执行的函数 。每当一个函数开始或者结束时,将会记录一条日志,包括函数标识符、是开始还是结束、以及相应的时间戳。给你一个由日志组成的列表 logs ,其中 logs[i] 表示第 i 条日志消息,该消息是一个按 "{func.原创 2021-07-29 23:07:28 · 219 阅读 · 0 评论 -
622 设计循环队列(模拟)
1. 问题描述:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyCircularQueue(k): 构造器,设置队列长度为 k 。Front: 从队首获取元素。如果队列原创 2021-07-28 10:58:49 · 115 阅读 · 0 评论 -
591 标签验证器(模拟、栈匹配括号)
1. 问题描述:给定一个表示代码片段的字符串,你需要实现一个验证器来解析这段代码,并返回它是否合法。合法的代码片段需要遵守以下的所有规则:代码必须被合法的闭合标签包围。否则,代码是无效的。 闭合标签(不一定合法)要严格符合格式:<TAG_NAME>TAG_CONTENT</TAG_NAME>。其中,<TAG_NAME>是起始标签,</TAG_NAME>是结束标签。起始和结束标签中的 TAG_NAME 应当相同。当且仅当TAG_NAME 和 TAG_.原创 2021-07-26 16:52:31 · 212 阅读 · 0 评论 -
单调栈-找到左边/右边第一个比自己小/大的元素
1. 问题描述:已知一个int类型的整型数组,在nums数组中找到左边或者右边比自己小或者大的元素2. 思路分析:这是经典的单调栈的题目,我们可以在遍历nums数组元素的时候维护一个单调栈,主要分为以下几种情况:左边第一个比自己小的元素 左边第一个比自己大的元素 右边第一个比自己小的元素 右边第一个比自己大的元素分析可知我们可以根据找的是左边还是右边来确定nums数组的遍历顺序,如果是左边那么我们可以从逆序遍历nums数组,如果是右边那么从下标为0遍历nums数组,根据比自己小还是比原创 2021-07-04 20:55:10 · 1716 阅读 · 0 评论 -
402 移掉 K 位数字(贪心、栈)
1. 问题描述:给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。示例 1 :输入:num = "1432219", k = 3输出:"1219"解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。示例 2 :输入:num = "10200", k = 1输出:"200"解释:移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。示例 3 :输原创 2021-06-23 09:51:46 · 281 阅读 · 0 评论 -
388 文件的最长绝对路径(栈维护层次关系)
1. 问题描述:2. 思路分析:3. 代码如下:原创 2021-06-20 18:20:03 · 220 阅读 · 1 评论 -
蓝桥杯表达式计算
1. 问题描述:输入一个只包含加减乘除和括号的合法表达式,求表达式的值。其中除表示整除。输入格式输入一行,包含一个表达式。输出格式输出这个表达式的值。样例输入1-2+3*(4-5)样例输出-4数据规模和约定表达式长度不超过100,表达式运算合法且运算过程都在int内进行。来源:http://lx.lanqiao.cn/problem.page?gpid=T4192. 思路分析:这是一道经典的栈的应用的题目,对于表达式求解的问题都是经典的套路,我们需要声明两个栈,因原创 2021-06-14 18:10:42 · 235 阅读 · 0 评论 -
239 滑动窗口最大值(单调递减队列)
1. 问题描述:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 ...原创 2021-05-18 20:47:54 · 183 阅读 · 2 评论 -
232 用栈实现队列(栈和队列)
1. 问题描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有push to top,peek/pop from t..原创 2021-05-15 12:16:22 · 115 阅读 · 0 评论 -
227 基本计算器 II(栈)
1. 问题描述:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。示例 1:输入:s = "3+2*2"输出:7示例 2:输入:s = " 3/2 "输出:1示例 3:输入:s = " 3+5 / 2 "输出:5提示:1 <= s.length <= 3 * 105s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开s 表示一个 有效表达式表达式中的所有整数都是非负整数,且在原创 2021-05-14 17:37:24 · 171 阅读 · 0 评论 -
225 用队列实现栈(栈-队列)
1. 问题描述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本操作 —— 也就是push to back、peek/pop from fro.原创 2021-05-14 15:12:29 · 206 阅读 · 2 评论 -
224 基本计算器(栈)
1. 问题描述:给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。示例 1:输入:s = "1 + 1"输出:2示例 2:输入:s = " 2-1 + 2 "输出:3示例 3:输入:s = "(1+(4+5+2)-3)+(6+8)"输出:23提示:1 <= s.length <= 3* 105 s由数字、'+'、'-'、'('、')'、和' '组成 s表示一个有效的表达式来源:力扣(LeetCode)链接:https...原创 2021-05-14 09:21:26 · 186 阅读 · 0 评论 -
1834 单线程 CPU(lambda表达式排序 + 优先队列)
1. 问题描述:给你一个二维数组 tasks ,用于表示 n 项从 0 到 n - 1 编号的任务。其中 tasks[i] = [enqueueTimei, processingTimei] 意味着第 i 项任务将会于enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。现有一个单线程 CPU ,同一时间只能执行最多一项任务,该 CPU 将会按照下述方式运行:如果 CPU 空闲,且任务队列中没有需要执行的任务,则 CPU 保持空闲状态。如果原创 2021-04-29 11:17:23 · 333 阅读 · 0 评论 -
小明的作业(使用栈匹配字符串)
1. 问题描述:小明同学正在学习一种新的语言。在该语言中,如果出现了一次wa或者一次aw,则代表出现了一个警告。如果出现了连续的wa或者连续的aw,则代表出现了一个错误。小明由于学习比较粗心,所以他想要知道自己刚刚写完的作业中一共出现了多少处警告和错误。下面是小明刚刚写完的作业,请你帮助小明找到他一共出现了多少次警告和多少次错误。abcwaawawawa中出现了一次警告(wa)和一次错误(awawaw)abcdefg中没有出现一次警告和错误waawwaawwawa中出现了四次警告(两次wa和两次a原创 2021-04-14 10:01:59 · 215 阅读 · 0 评论 -
122 买卖股票的最佳时机 II(寻找所有单调递增的序列-栈)
1. 问题描述:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(原创 2021-03-15 16:41:03 · 166 阅读 · 0 评论 -
找出右边第一个比自己大的元素所需的步数(单调栈)
1. 问题描述:给一个int类型数组, 返回一个大小相同的数组,返回的数组的第i个位置的值应当是,对于原数组中的第i个元素,至少往右走多少步,才能遇到一个比自己大的元素(知乎上关于单调栈的题目)2. 思路分析:这道题目是关于单调栈的典型题目,我们只需要在栈中维护一个递减的子序列即可,当发现栈顶元素小于当前遍历的元素的时候说明序列是递增的,这个时候需要弹出栈顶的元素,当前遍历的元素下标减去栈顶元素的下标表示的是栈顶元素这个位置到第一个比自己大的步数,一直弹出元素直到栈顶元素大于等于当前遍历的元素位原创 2020-12-21 21:33:36 · 574 阅读 · 0 评论 -
1673 找出最具竞争力的子序列(单调栈)
1. 问题描述:给你一个整数数组 nums 和一个正整数 k ,返回长度为 k 且最具竞争力的 nums 子序列。数组的子序列是从数组中删除一些元素(可能不删除元素)得到的序列。在子序列a 和子序列b 第一个不相同的位置上,如果a中的数字小于 b 中对应的数字,那么我们称子序列 a 比子序列 b(相同长度下)更具 竞争力 。 例如,[1,3,4] 比 [1,3,5] 更具竞争力,在第一个不相同的位置,也就是最后一个位置上,4 小于 5 。示例 1:输入:nums = [3,5,2,6]...原创 2020-12-21 20:40:42 · 1072 阅读 · 0 评论 -
735 行星碰撞(栈匹配元素)
1. 问题描述:给定一个整数数组 asteroids,表示在同一行的行星。对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。示例 1:输入:asteroids = [5, 10, -5]输出: [5, 10]解释:10 和 -5 碰撞后只剩下 1..原创 2020-11-29 15:52:06 · 180 阅读 · 0 评论 -
581 最短无序连续子数组(排序-双指针、栈匹配元素对应的位置)
1. 问题描述:给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。你找到的子数组应是最短的,请输出它的长度。示例 1:输入: [2, 6, 4, 8, 10, 9, 15]输出: 5解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。输入的数组长度范围在[1, 10,000]。 输入的数组可能包含重复元素,所以升序的意思是<=。来源:力扣(LeetCode)链接:https..原创 2020-11-25 11:12:48 · 159 阅读 · 0 评论 -
1021 删除最外层的括号(栈)
1. 问题描述:有效括号字符串为空("")、"(" + A + ")"或A + B,其中A 和B都是有效的括号字符串,+代表字符串的连接。例如,"","()","(())()"和"(()(()))"都是有效的括号字符串。如果有效字符串S非空,且不存在将其拆分为S = A+B的方法,我们称其为原语(primitive),其中A 和B都是非空有效括号字符串。给出一个非空有效字符串S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + ... + P_k,其中...原创 2020-11-04 11:17:27 · 138 阅读 · 0 评论 -
1047 删除字符串中的所有相邻重复项(栈)
1. 问题描述:给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:"abbaca"输出:"ca"解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。.原创 2020-10-16 15:57:06 · 259 阅读 · 0 评论 -
1614 括号的最大嵌套深度(栈)
1. 问题描述:如果字符串满足一下条件之一,则可以称之为 有效括号字符串(valid parentheses string,可以简写为 VPS):字符串是一个空字符串 "",或者是一个不为 "(" 或 ")" 的单字符。字符串可以写为 AB(A 与 B字符串连接),其中 A 和 B 都是 有效括号字符串 。字符串可以写为 (A),其中 A 是一个 有效括号字符串 。类似地,可以定义任何有效括号字符串S 的嵌套深度 depth(S):depth("") = 0depth(A + B) = ..原创 2020-10-11 21:00:53 · 504 阅读 · 0 评论 -
1598 文件夹操作日志搜集器(栈)
1. 问题描述:每当用户执行变更文件夹操作时,LeetCode 文件系统都会保存一条日志记录。下面给出对变更操作的说明:"../" :移动到当前文件夹的父文件夹。如果已经在主文件夹下,则 继续停留在当前文件夹 。"./" :继续停留在当前文件夹。"x/" :移动到名为 x 的子文件夹中。题目数据 保证总是存在文件夹 x 。给你一个字符串列表 logs ,其中 logs[i] 是用户在 ith 步执行的操作。文件系统启动时位于主文件夹,然后执行 logs 中的操作。执行完所有变更文件夹操作后,请原创 2020-10-11 11:16:06 · 165 阅读 · 0 评论 -
1190 反转每对括号间的子串(栈)
1. 问题描述:给出一个字符串s(仅含有小写英文字母和括号)。请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中 不应 包含任何括号。示例 1:输入:s = "(abcd)"输出:"dcba"示例 2:输入:s = "(u(love)i)"输出:"iloveu"示例 3:输入:s = "(ed(et(oc))el)"输出:"leetcode"示例 4:输入:s = "a(bcdefghijkl(mno)p)q".原创 2020-08-03 11:32:52 · 347 阅读 · 0 评论 -
1249 移除无效的括号(栈的应用)
1. 问题描述:给你一个由 '('、')' 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 '(' 或者 ')'(可以删除任意位置的括号),使得剩下的「括号字符串」有效。请返回任意一个合法字符串。有效「括号字符串」应当符合以下任意一条要求:空字符串或只包含小写字母的字符串可以被写作AB(A连接B)的字符串,其中A和和 B 都是有效「括号字符串」可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」示例 1:输入:s = "lee(t(c...原创 2020-07-05 22:06:49 · 340 阅读 · 0 评论 -
1311 获取你好友已观看的视频(set、map、优先队列排序)
1. 问题描述:有n 个人,每个人都有一个0到n-1的唯一id。给你数组 watchedVideos和friends,其中watchedVideos[i]和friends[i]分别表示id = i的人观看过的视频列表和他的好友列表。Level1的视频包含所有你好友观看过的视频,level2的视频包含所有你好友的好友观看过的视频,以此类推。一般的,Level 为 k的视频包含所有从你出发,最短距离为k的好友观看过的视频。给定你的id和一...原创 2020-06-13 23:39:11 · 271 阅读 · 0 评论 -
224 基本计算器(栈)
1. 问题描述:实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式可以包含左括号(,右括号),加号+,减号-,非负整数和空格。示例 1:输入: "1 + 1"输出: 2示例 2:输入: " 2-1 + 2 "输出: 3示例 3:输入: "(1+(4+5+2)-3)+(6+8)"输出: 23说明:你可以假设所给定的表达式都是有效...原创 2020-04-18 22:03:19 · 275 阅读 · 0 评论 -
921 使括号有效的最少添加(栈)
1. 问题描述:给定一个由'('和')'括号组成的字符串 S,我们需要添加最少的括号( '('或是')',可以在任何位置),以使得到的括号字符串有效。从形式上讲,只有满足下面几点之一,括号字符串才是有效的:它是一个空字符串,或者它可以被写成AB(A与B连接), 其中A 和B都是有效字符串,或者它可以被写作(A),其中A是有效字符串。给定一个括号字...原创 2020-04-16 18:51:40 · 268 阅读 · 0 评论 -
150 逆波兰表达式求值(栈)
1. 问题描述:根据逆波兰表示法,求表达式的值。有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例1:输入: ["2", "1", "+", "3", "*"]输出: 9解释: ((2 + 1) * 3)...原创 2020-04-14 11:14:42 · 223 阅读 · 0 评论 -
队列
1. 问题网址:http://lx.lanqiao.cn/problem.page?gpid=T418问题描述:问题描述 队列操作题。根据输入的操作命令,操作队列(1)入队、(2)出队并输出、(3)计算队中元素个数并输出输入格式 第一行一个数字N 下面N行,每行第一个数字为操作命令(1)入队、(2)出队并输出、(3)计算队中元素个数并输出输出格式 若干行...原创 2019-02-17 20:45:51 · 191 阅读 · 0 评论 -
猫狗收容所(队列)
1. 问题描述:有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。给定一个操作序列int[][2] ope(C++中为vector<vector<int>>)代表所有事件。若第一个元素为1,则代表有动物进入收容所,第二个元素为...原创 2018-12-04 19:30:09 · 2138 阅读 · 0 评论 -
两个栈实现队列
1. 问题描述:实现一个MyQueue类,该类用两个栈来实现一个队列(题目是cc150上的一道题目)2. 使用两个栈来实现一个队列其实使用到了另外的一个栈对于数据的缓冲作用,我们可以这样想:在入栈的时候直接压入堆栈即可,在弹出堆栈的时候此时需要借助于另外一个堆栈来进行缓冲,把第一个堆栈的元素全部压入到第二个堆栈中然后弹出第二个堆栈的栈顶元素这样就完成了队列先进先出的要求,然后再把第二个堆栈...原创 2018-12-04 21:13:01 · 227 阅读 · 0 评论 -
栈
1. 栈的定义:栈又名堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素2. jdk中实现的栈的方法主要是入栈方法push(),出栈方法po...原创 2018-12-04 21:23:41 · 175 阅读 · 0 评论 -
C语言使用链表实现栈
1. 使用C语言中的链表来实现栈2. 我们知道栈的特点是先进后出,而链表中的头插法正好满足我们的需求,因为头插法后面插入的节点位于链表的开头,所以我们可以使用头插法来插入节点,在弹出节点的时候弹出链表的第一个节点即可,而第一个节点是很容易找出来的,所以可以很轻松地实现栈的压入和弹出操作3. 下面是具体的代码:#include<stdio.h>#include<ma...原创 2019-06-30 09:14:18 · 6238 阅读 · 3 评论 -
表达式的计算(后缀表达式的求解)
1. 问题网址:http://lx.lanqiao.cn/problem.page?gpid=T419问题描述:问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除输入格式 输入一行,包含一个表达式输出格式 输出这个表达式的值样例输入1-2+3*(4-5)样例输出-4数据规模和约定 表达式长度不超过100,...原创 2019-02-18 20:32:48 · 24313 阅读 · 3 评论 -
将十进制数字转换为二进制数字(栈的应用)
1. 问题描述:编写一个算法,将一个非负十进制数字n转换为二进制数字2. 思路分析:① 十进制数字转换为其他进制的数字可以使用辗转相除法,直到最后n == 0结束,对于这道题目是转换为二进制数字,结合辗转相除法在循环中我们每次先求解出n % 2的结果,然后将n除以2,因为每一次我们计算出的结果是从低位开始的,所以需要借助于栈来存储n % 2的结果,等到n / 2 == 0的时候结束,那...原创 2019-06-29 20:39:00 · 9521 阅读 · 0 评论 -
中缀表达式转为后缀表达式求值(栈和队列的应用)
1. 题目描述:读入一个只包含+,-,*,/,(,)的整数范围内的计算表达式,计算该表达式的值,输出的结构为double类型的一个值(对于除法的运算是有可能带有小数的)2. 思路分析:① 首先这道题目使用常规的方法是很难正确解决出来的,因为涉及到了运算符的优先级的问题,而且表达式中还存在着左括号与右括号的优先级问题,所以我们在读入字符串的时候是判断运算符的优先级的时候特别麻烦,所以来说...原创 2019-06-25 20:01:27 · 2769 阅读 · 1 评论