栈
木道-
这个作者很懒,什么都没留下…
展开
-
LeetCode636 函数的独占时间
题目解题思路:函数的调用满足完全包含关系,可以使用栈来处理,函数开始调用则入栈,结束调用则出栈,想办法之前的一次函数操作时间即可。函数独占时间指的是:当前函数从开始到结束时间段内没有再进行函数调用的时间段函数调用(入栈)时,如果有父函数,那么就要结算父函数的独占时间(当前函数的调用时间-父函数的调用时间),如果没有父函数,直接入栈,记录时间即可。函数结束(出栈)时,要立即结算其独占时间(结束时间-开始时间+1),如果有父函数,那么逻辑上当当前函数结束调用,父函数会在(当前函数结束时间+1)的时原创 2021-05-07 20:45:54 · 233 阅读 · 1 评论 -
LeetCode227 基本计算器II(重点)
题目给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。解题思路本题利用栈来求解,定义两个栈,一个存数字,一个存运算符,我们可以先明确一个点,逻辑上讲数字栈的元素个数是永远比运算符栈多一位的,所以当运算符栈存运算符,那么就可以直接对数字栈进行弹栈运算操作,当当前的运算符想要入栈时,需要判断它与栈顶运算符的优先级,来决定是否进行运算操作,当程序运行到最后,利用手动补充到字符串末尾的@运算符来计算最后剩下的表达式,最终数字栈将只存在一个元素,运算符栈将剩下一个原创 2021-05-07 17:49:03 · 138 阅读 · 0 评论 -
LeetCode331 验证二叉树的前序序列化
题目序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #例如,上面的二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”,其中 # 代表一个空节点。给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 ‘#’ 。你可以认为输入格式总是有效的,例如它永远不会包含两原创 2021-05-07 10:00:36 · 169 阅读 · 0 评论 -
LeetCode 145 二叉树的后序遍历(重要)
题目给定一个二叉树,返回它的 后序 遍历。解题思路本题我们不使用递归的方式,而是使用栈的方式来实现,实例化两个栈,s1存储树节点,s2存储树节点的状态码,状态码共有3个值0,1,2;0代表该节点需要压入左节点,1代表该节点需要压入右节点,2代表左右子树都遍历完了,输出本节点。代码public List<Integer> postorderTraversal(TreeNode root) { if(root == null){ return ne原创 2021-05-06 19:16:47 · 110 阅读 · 0 评论 -
LeetCode1249 移除无效的括号
题目给你一个由 ‘(’、’)’ 和小写字母组成的字符串 s。你需要从字符串中删除最少数目的 ‘(’ 或者 ‘)’ (可以删除任意位置的括号),使得剩下的「括号字符串」有效。请返回任意一个合法字符串。有效「括号字符串」应当符合以下 任意一条 要求:空字符串或只包含小写字母的字符串可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」解题思路本题可以使用栈实现,我使用的是创建模拟栈顶指针变量来实原创 2021-05-06 14:36:32 · 138 阅读 · 0 评论 -
LeetCode 1021 删除最外层的括号
题目有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + … + P_k,其中 P_i 是有效括原创 2021-05-06 12:45:05 · 233 阅读 · 0 评论 -
LeetCode 20 有效的括号
题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。解题思路本题满足完全包含关系,也就是说我们可以使用栈来解题,遍历字符串,当遇到左括号(、[、{时,将其入栈,当遇到右括号时,判断栈顶元素是否是对应的左括号,如果是则弹栈,最后判断栈是否为空即可。代码public boolean isValid(String s) { Stack<Charac原创 2021-05-06 11:48:30 · 106 阅读 · 0 评论 -
LeetCode946 验证栈序列
题目:给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), push(4), pop() -> 4, push(5), pop() -> 5,原创 2021-05-05 18:52:57 · 109 阅读 · 0 评论 -
Leetcode844 比较含退格的字符串
题目给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。示例 :输入:S = “ab#c”, T = “ad#c”输出:true解释:S 和 T 都会变成 “ac”。解题思路利用栈解决,扫描字符串,遇到"#"时,弹栈即可代码public static boolean backspaceCompare(String s, String t) { return Objec原创 2021-05-05 16:20:36 · 124 阅读 · 0 评论 -
LeetCode682 棒球比赛
题目你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:整数 x - 表示本回合新获得分数 x "+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。"D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效原创 2021-05-05 15:42:06 · 153 阅读 · 0 评论 -
LeetCode 面试题03.04 化栈为队
题目:实现一个MyQueue类,该类用两个栈来实现一个队列。解题思路:实例化两个栈s1(入队),s2(出队);入队操作时元素压入s1中,出队操作时判断s2是否为空,若为空那么依次将s1中的元素压入s2中,若不为空,s2出栈即可。代码:static class MyQueue { Stack<Integer> stack1; Stack<Integer> stack2; /** Initialize your data str原创 2021-05-05 13:54:27 · 124 阅读 · 0 评论