为什么80%的码农都做不了架构师?>>>   

栈应用的场景:
1.括号问题
2.后缀表达式
3.深度优先遍历
4.保存现场

1. 给定字符串,仅由“()[]{}”六个字符组成。设计算法,判断该字符串是否有效。

    括号必须以正确的顺序配对,如“()”、“()[]{}”是有效的,但"([)]"是无效的(Leetcode 20)。

思想就是碰到左括号压栈,右括号出栈,然后判断弹出的元素是不是一对,最后栈为空则是真的。

代码如下:

public class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<Character>();boolean isvalid = true;char[] c = s.toCharArray();char temp;for (int i = 0; i < c.length; i++){switch (c[i]){case '(':stack.push(c[i]);break;case ')':if(stack.isEmpty()){isvalid = false;}else {temp = stack.pop();if (temp != '('){isvalid = false;}}break;case '[':stack.push(c[i]);break;case ']':if(stack.isEmpty()){isvalid = false;}else {temp = stack.pop();if (temp != '['){isvalid = false;}}break;case '{':stack.push(c[i]);break;case '}':if(stack.isEmpty()){isvalid = false;}else{temp = stack.pop();if (temp != '{'){isvalid = false;}}break;default:break;}}if(isvalid){if(!stack.isEmpty()){isvalid = false;}}return isvalid;}
}

顺便提一下:关于括号匹配问题,还有一个括号的组成个数问题,给定n组括号,问有多少种合法表达式,也是应用栈。(参kao这里,算法篇第8题)

2. 给定字符串,仅包含"("和")",它可能不是全匹配的,设计算法找出最长匹配的括号子串,返回该子串的长度。(Leetcode 32)

For example:

")()())":4

"()(()":2

"()(())":6

看到括号问题,第一反应就是用栈,一个简单的思想就是与第一问一样,每次匹配成功,则把成功的位置做个记号,最后看记号的最长子串是多少即可比如"()(()"记号就可以是"YYNYY"。要遍历两次,时间复杂度为O(2n) = O(n)

public class Solution {public int longestValidParentheses(String s) {char[] c = s.toCharArray();boolean[] b = new boolean[c.length];Stack<Integer> stack = new Stack<Integer>();for (int i = 0; i < c.length; i++){if (c[i] == '('){stack.push(i);}else if (c[i] == ')' && !stack.isEmpty()){int index = stack.pop();b[index] = true;b[i] = true;}}int maxLength = 0;int length = 0;for (int i = 0; i < c.length; i++){if (b[i]){length++;}else{length = 0;}maxLength = maxLength > length ? maxLength : length;}return maxLength;}
}

以上的方法需要遍历两次,有没有只遍历一次的方法呢?

我们定义两个变量,start=-1,最大匹配长度ml=0

变量i为当前扫描的字符

栈内只可能是"(",碰到"("就压栈,碰到")"就出栈。由于我们要计算的最长匹配长度,所以压栈的是"("的下标方便计算长度。

在任何时候,只要栈不空,那么存在栈里的元素的意义就是当前尚未被匹配的‘(’。因为若匹配,我们会进行pop操作,所以在进行一次匹配后,我们若判断栈不空,那就说明至少栈顶的元素是没有匹配的,而这个没有匹配的栈顶‘(’,极有可能到最后也得不到匹配,所以我们这时要及时的更新最大长度,那么当前的已经匹配的长度是多少呢?是当前访问元素的index - 栈顶元素的值。若进行一次匹配操作后,发现栈为空了,这说明什么呢?说明是处于连续的匹配中,这时我们也要跟新最大长度,因为极有可能在以后就不匹配了,当前这个匹配的最大结果要进行保留。但是此时,我们只有当前遍历元素的下标,另外一个值是什么呢?也就是减数是多少呢?所以我们还需要定义一个变量start,用来表示每一次连续匹配的起始点,我们用当前的下标- start来表示当前的最大长度。那么若当前遍历的元素为‘)’,且此时栈为空,说明什么呢?说明在此之前,就没有多余的‘(’,说明这就是个坑,是个不匹配的点,此时我们要做些什么呢?简单的将该字符跳过,去处理下一个字符吗?回头看看我们刚才分析中,涉及到了一个连续匹配的起始点问题,对,我们要更改这个连续匹配的起始点,令其等于当前处理的‘)’字符的位置。

所以总体流程如下:

如果为"(",压栈

如果为")":

栈为空:start = i

栈不为空:出栈

此时栈为空:ml = i -start

栈不为空:ml = i - 栈顶元素

代码:

public class Solution {public int longestValidParentheses(String s) {char[] c = s.toCharArray();int start = -1;int ml = 0;Stack<Integer> stack = new Stack<Integer>();for (int i = 0; i < c.length; i++){if (c[i] == '('){stack.push(i);}else{if (stack.isEmpty()){start = i;}else{stack.pop();if (stack.isEmpty()){ml = (i - start) > ml ? (i - start) : ml;}else{ml = (i - stack.peek()) > ml ? (i - stack.peek()) : ml;}}}}return ml;}
}

时间复杂度O(n)

3. 计算给定的后缀表达式值,有效操作只有+-*/,每个操作数都是整数。(Leetcode 150)

Some examples:

["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

除了括号问题,后缀表达式也是一个常用栈来处理的问题。碰到数字就压栈,碰到操作符弹出两个数字计算后,结果再压栈。

代码:

public class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<Integer>();int res = 0;int a,b;for (int i = 0; i < tokens.length; i++){switch (tokens[i]){case "+":a = stack.pop();b = stack.pop();res = a + b;stack.push(res);break;case "-":a = stack.pop();b = stack.pop();res = b - a;stack.push(res);break;case "*":a = stack.pop();b = stack.pop();res = b * a;stack.push(res);break;case "/":a = stack.pop();b = stack.pop();res = b / a;stack.push(res);break;default:stack.push(Integer.parseInt(tokens[i]));res = Integer.parseInt(tokens[i]);break;}}return res;}
}

注意类似["18"]这种情况,需要返回18。

系列:

【算法系列 一】 Linked List

【算法系列 二】 Stack

【算法系列 三】 Quene

【算法系列 四】 String

转载于:https://my.oschina.net/hosee/blog/626577

【算法系列 二】Stack相关推荐

  1. 算法系列(二):贪心算法--Huffman编码

    算法系列(二):贪心算法--Huffman编码 一.分析 问题描述: 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法.其压缩率通常在20%-90%之间.哈夫曼编码算法使用字符在文件中出现的频率 ...

  2. 【算法系列 三】 Quene

    为什么80%的码农都做不了架构师?>>>    1. 拓扑排序问题(HDU 1285) import java.io.BufferedReader; import java.io.I ...

  3. 【Python算法系列十一】二叉树的3种遍历方式

    二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次. 遍历二叉树的方法主要分 3 种:先序遍历.中序遍历和后序遍历: 先序遍历指最先遍历节点本身, ...

  4. 算法系列之二十:计算中国农历(二)

    (接上篇) 所谓的"天文算法",就是利用经典力学定律推导行星运转轨道,对任意时刻的行星位置进行精确计算,从而获得某种天文现象发生时的时间,比如日月合朔这一天文现象就是太阳和月亮的地 ...

  5. 人工智能算法通俗讲解系列(二):逻辑回归

    2019独角兽企业重金招聘Python工程师标准>>> 今天,我们介绍的机器学习算法叫逻辑回归.它英语名称是Logistic Regression,简称LR. 跟之前一样,介绍这个算 ...

  6. 精通八大排序算法系列:二、堆排序算法

    精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...

  7. 八十二、Python | Leetcode贪心算法系列

    @Author:Runsen @Date:2020/7/5 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  8. [算法系列之二十六]字符串匹配之KMP算法

    一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利 ...

  9. YOLO系列 --- YOLOV7算法(二):YOLO V7算法detect.py代码解析

    YOLO系列 - YOLOV7算法(二):YOLO V7算法detect.py代码解析 parser = argparse.ArgumentParser()parser.add_argument('- ...

最新文章

  1. android singleTop 不起作用
  2. 计算机开不开机是什么原因是什么原因,电脑开不了机的原因,详细教您电脑开不了机怎么办...
  3. 网易青果后端系统设计窥探(含直播方案踩坑往事)
  4. innodb_flush_log_at_trx_commit
  5. matlab设计理想数字带通滤波器,基于matlab的数字带通滤波器课程设计报告
  6. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...
  7. 数据库流行度7月排行榜:Oracle 和 MySQL 暴跌创历史新低
  8. 黑马公开课——运行原理与GC学习笔记
  9. Python教程-python字典中key的灵活使用fromkeys()
  10. 笨方法学Python 习题16
  11. Windows 10调整色温显示器
  12. Excel教程(8) - 财务函数
  13. Java job interview:Linux操作系统的应用(红帽子)分析经验
  14. 只能输入数字的正则表达式
  15. JS 按钮下一步 下拉菜单内容转换
  16. 【解决】CSS下拉菜单不会显示的问题
  17. 学习编程,这些好习惯带我们平步青云——直通大牛
  18. UML交流群2月14日讨论内容!
  19. 招远一职专计算机专业都学什么,招远一职专计算机专业技能指导教师李欣经
  20. Oracle数据库中的方案,学习Oracle数据库_理解Oracle数据库中的方案

热门文章

  1. 今日头条CEO朱文佳:新一代搜索引擎已经来了
  2. “如果没有IBM和其所提供的系统,我们就无法登上月球。”
  3. 五大核心构成的AIoT,正在遭遇三大挑战,两条突破口外还有什么?
  4. 这一年,信息技术领域上演的“断舍离”
  5. 人工智能+能源:能源行业变革新趋势
  6. CICC科普栏目|神经网络浅讲:从神经元到深度学习
  7. 深度学习不是AI的未来
  8. 2021 年 6 月程序员工资统计,平均 15052 元
  9. 大写的服!90 后程序员利用业余时间帮网友鉴定毒蘑菇,拥有百万粉丝成网络大 V...
  10. 四款 5G 版 iPhone 12 齐发,支持北斗系统,你准备好了吗?