有关栈的算法

例题一

解法(栈):
算法思路:
本题极像我们玩过的「开⼼消消乐」游戏,仔细观察消除过程,可以发现本题与我们之前做过的「括号匹配」问题是类似的。当前元素是否被消除,需要知道上⼀个元素的信息,因此可以⽤「栈」来保存信息。但是,如果使⽤ stack 来保存的话,最后还需要把结果从栈中取出来。不如直接⽤「数组模拟⼀个栈」结构:在数组的尾部「尾插尾删」,实现栈的「进栈」和「出栈」。那么最后数组存留的内容,就是最后的结果。

例题二

解法(⽤数组模拟栈):
算法思路:
由于退格的时候需要知道「前⾯元素」的信息,⽽且退格也符合「后进先出」的特性。因此我们可以使⽤「栈」结构来模拟退格的过程。
当遇到⾮ # 字符的时候,直接进栈;
当遇到 # 的时候,栈顶元素出栈。
为了⽅便统计结果,我们使⽤「数组」来模拟实现栈结构。

例题三

解法(栈):
算法思路:
由于表达式⾥⾯没有括号,因此我们只⽤处理「加减乘除」混合运算即可。根据四则运算的顺序,我们可以先计算乘除法,然后再计算加减法。由此,我们可以得出下⾯的结论:
当⼀个数前⾯是 '+' 号的时候,这⼀个数是否会被⽴即计算是「不确定」的,因此我们可以先压
⼊栈中;
当⼀个数前⾯是 '-' 号的时候,这⼀个数是否被⽴即计算也是「不确定」的,但是这个数已经
和前⾯ 的 - 号绑定了,因此我们可以将这个数的相反数压⼊栈中;
当⼀个数前⾯是 '*' 号的时候,这⼀个数可以⽴即与前⾯的⼀个数相乘,此时我们让将栈顶的元
素乘上这个数;
当⼀个数前⾯是 '/' 号的时候,这⼀个数也是可以⽴即被计算的,因此我们让栈顶元素除以这个
数。
当遍历完全部的表达式的时候,栈中剩余的「元素之和」就是最终结果。

例题四

解法(两个栈):
算法思路:
对于 3[ab2[cd]] ,我们需要先解码内部的,再解码外部(为了⽅便区分,使⽤了空格):
3[ab2[cd]] -> 3[abcd cd] -> abcdcd abcdcd abcdcd
在解码 cd 的时候,我们需要保存 3 ab 2 这些元素的信息,并且这些信息使⽤的顺序是从后往
前,正好符合栈的结构,因此我们可以定义两个栈结构,⼀个⽤来保存解码前的重复次数 k (左括号前的数字),⼀个⽤来保存解码之前字符串的信息(左括号前的字符串信息)。

例题五

解法(栈):
算法思路:
⽤栈来模拟进出栈的流程。⼀直让元素进栈,进栈的同时判断是否需要出栈。当所有元素模拟完毕之后,如果栈中还有元素,那么就是⼀个⾮法的序列。否则,就是⼀个合法的序列。

相关推荐

  1. -20.有效括号

    2024-04-06 16:56:01       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-06 16:56:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-06 16:56:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-06 16:56:01       82 阅读
  4. Python语言-面向对象

    2024-04-06 16:56:01       91 阅读

热门阅读

  1. 用虚拟机安装gnu radio

    2024-04-06 16:56:01       35 阅读
  2. 【数据结构】时间和空间复杂度

    2024-04-06 16:56:01       41 阅读
  3. 考研总计划篇

    2024-04-06 16:56:01       41 阅读
  4. C++类基础11——运算符重载

    2024-04-06 16:56:01       36 阅读
  5. tomcat处理Http请求流程的步骤

    2024-04-06 16:56:01       44 阅读
  6. Promise-以往的异步编程模式

    2024-04-06 16:56:01       36 阅读
  7. Acwing.504 转圈游戏(带取余的快速幂)

    2024-04-06 16:56:01       30 阅读
  8. 【一】Mac 本地部署大模型

    2024-04-06 16:56:01       35 阅读
  9. 使用Python的SQLite和Tkinter库来创建一个简单的查询

    2024-04-06 16:56:01       45 阅读
  10. Qt 线程

    2024-04-06 16:56:01       34 阅读