![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
栈
Betternw
这个作者很懒,什么都没留下…
展开
-
表达式求值
题目描述 请写一个整数计算器,支持加减乘三种运算和括号。 示例1:输入: “1+2” 返回值: 3 实例2:输入: “3+234-1” 返回值: 26 分析 对于「任何表达式」而言,我们都使用两个栈 nums 和 ops: nums : 存放所有的数字 ops :存放所有的数字以外的操作 然后从前往后做,对遍历到的字符做分情况讨论: 空格 : 跳过 ( : 直接加入 ops 中,等待与之匹配的 ) ) : 使用现有的 nums 和 ops 进行计算,直到遇到左边最近的一个左括号为止,计算结果放到 nums原创 2021-08-01 15:01:09 · 76 阅读 · 0 评论 -
151 翻转字符串里的单词
题目描述 给你一个字符串 s ,逐个翻转字符串中的所有 单词 。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。 说明: 输入字符串 s 可以在前面、后面或者单词间包含多余的空格。 翻转后单词间应当仅用一个空格分隔。 翻转后的字符串中不应包含额外的空格。 示例 1: 输入:s = “the sky is blue” 输出:“blue is sky the” 分析 去掉首尾空格 当前单词不为空时,连接到word原创 2021-07-07 10:34:33 · 46 阅读 · 0 评论 -
232 用栈实现队列
题目描述 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头的元素 boolean empty() 如果队列为空,返回 true ;否则,返回 false 说明: 你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, siz原创 2021-07-04 09:47:28 · 46 阅读 · 0 评论 -
【辅助栈】offer 31 栈的压入、弹出序列
题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列{1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。 输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 输出:true 解释:我们可以按以下顺序执行: push(1), push(2), push(3), push(4), po原创 2020-07-07 21:31:40 · 102 阅读 · 0 评论 -
【栈】 offer06 从尾到头打印链表
题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回) 输入:head = [1,3,2] 输出:[2,3,1] 代码 public int[] reversePrint(ListNode head) { Deque<Integer> stack = new LinkedList<>(); //记着头结点不能随意移动,要用其他变量代表头结点 ListNode cur = head; while(cur!=null){原创 2020-07-04 15:13:06 · 58 阅读 · 0 评论 -
offer 09 用两个栈实现队列
题目 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 输入: [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]] 输出:[null,null,3,-1] ...原创 2020-07-01 16:56:01 · 93 阅读 · 0 评论 -
【栈】 394 字符串解码
题目 k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 输入:s = “3[a]2[bc]” 输出:“aaabcbc” 输入:s = “3[a2[c]]” 输出:“accaccacc” 思路 建立两个栈,分别存储数字和字母。 建立数字和字符串进行临时记录。 当遍历到数字时,放入数字中。 当遍历到字母时,放入字符串中。 当遍历到【时,将数字放入数字栈,并清零。将字符串放入字符串栈中,并清空。 当遍历到】时,数组栈出数字作为重复次原创 2020-06-29 15:24:20 · 118 阅读 · 0 评论 -
【快慢指针/栈】234 回文链表
题目描述 判断一个链表是否为回文链表 分析 使用空间为n:将链表整个压入栈。然后栈元素弹出。挨个比较元素是否相同。 使用空间为n/2:快慢指针。快指针一次两步慢指针一次一步。快指针到达结尾时,慢指针到达中间,中间部分之后压入栈。然后栈弹出元素,与前半部分相比较。 不使用额外空间:快慢指针。快指针一次两步慢指针一次一步。快指针到达结尾时,慢指针到达中间。然后将后半部分链表逆序。两个指针分别从头尾出发,进行元素比较。最后要将后半部分再还原回来。 代码 ...原创 2020-05-29 21:14:21 · 135 阅读 · 0 评论 -
【辅助栈】155 最小栈
题目 设计一个支持push、pop、top操作,并能在常数内检索到最小元素的栈。 分析 使用辅助栈。 当新来的数字小于或等于辅助栈栈顶元素、或者辅助栈为空时,将元素放入。 pop时候,如果原栈出元素,辅助栈有这个元素也要一起出栈。 获得的最小元素就是辅助栈的栈顶。 代码 public class solution155 { private Stack<Integer> data; private Stack<Integer> help; public sol原创 2020-06-05 23:51:32 · 150 阅读 · 0 评论 -
【哈希表 +栈】 20 有效的括号
题目描述 给定一个只包括 ()【】{}的字符串,判断是否有效。左括号必须用相同类型的右括号闭合,左括号必须以正确的顺序闭合。 思路分析 首先字符串转换成字符数组,可以进行for的循环。用栈进行判断,当左括号时,入栈,当右括号时,出栈,如果最后栈非空,返回错误。 用哈希数组进行辅助,增加了代码的复用性。同时减少了判断次数:键值对,用key代表闭括号进行判断 代码实现 ...原创 2020-02-19 20:38:47 · 123 阅读 · 0 评论