个人笔记03-栈和队列-方向一笔记 | 豆包MarsCode AI 刷题

101 阅读2分钟

方向一笔记-个人笔记03:栈和队列

栈先进后出(FILO)和队列先进先出(FIFO)的特点,是用它们解决一些与匹配、调度相关的问题的基础。

在python中,用list就可以模拟两种数据结构。对于栈,每次增加元素时使用append()方法,弹出元素时可使用element=list.pop()(这样返回的element就是list最后一个元素,同时list删除最后一个元素);对于队列,增加元素方法相同,弹出元素时可使用element=list.pop(0)(这样list删除第一个元素)。

(栈)例1:小R有一个括号字符串 s,他想知道这个字符串是否是有效的。一个括号字符串如果满足以下条件之一,则是有效的:

它是一个空字符串;

它可以写成两个有效字符串的连接形式,即 AB;

它可以写成 (A) 的形式,其中 A 是有效字符串。

在每次操作中,小R可以在字符串的任意位置插入一个括号。你需要帮小R计算出,最少需要插入多少个括号才能使括号字符串 s 有效。

(思路)括号匹配是栈使用的经典案例。记索引为i,遍历s的每个字符:

①  s[i]为左括号,入栈;

②  s[i]为右括号,则:如果栈顶为左括号,则栈顶出栈;如果栈为空/栈顶为右括号,则s[i]入栈。

最终,栈中元素个数即为还需要添加的括号数(因为括号需要成对)。

(队列)例2:小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。例如,给定歌单[5, 3, 2, 1, 4],真实的播放顺序是[5, 2, 4, 1, 3]。保证歌曲中的id两两不同。

(思路)用ans按播放顺序存储歌曲。首先将歌单a中的a[0]弹出,加入ans。接下来,只要歌单a非空,则front=a.pop(0)以删除第一个元素(即队头元素),将其加入a的最后(使其成为队尾元素)。接着把此时的a[0]弹出,加入ans。