当前位置:   article > 正文

关于栈的常见编程题_栈的题目

栈的题目

目录

一、括号匹配

二、逆波兰表达式求值

三、出栈入栈次序匹配

1、选择题之选择哪一种是正确的次序匹配函数

2、编程题之判断出栈顺序是否存在可能

一、括号匹配

        LeetCode——20.有效的括号

题目描述:

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

例:

输入:"(){}[]"            输出:true

输入:"({[]})"            输出:true

输入:"(}{)"              输出:false

输入:"(){]"              输出:false

思考:

此时我们可以利用栈先入后出的特性,以"({[]})"为例,先在栈中压入"(",后看剩余字符串中的第一个元素是否与栈顶元素相匹配,如果不匹配,则入栈,否则出栈,到下一个字符。

我们也可以进行优化,如上述描述,入栈的一定都是左括号,碰到右括号再去进行匹配,匹配不成功则直接返回false,当字符串走完的时候,如果栈为空,则返回true,否则返回false。  

括号匹配

  1. import java.util.Stack;
  2. class Solution {
  3. public boolean isValid(String s) {
  4. char[] arr=s.toCharArray();
  5. Stack<Character> stack=new Stack<>();
  6. for(char n:arr){
  7. if(stack.empty()){
  8. stack.push(n);
  9. continue;
  10. }
  11. char a=stack.peek();
  12. char b=n;
  13. if(
  14. (a=='('&&b==')')||
  15. (a=='{'&&b=='}')||
  16. (a=='['&&b==']')
  17. )
  18. {
  19. stack.pop();
  20. }else{
  21. stack.push(n);
  22. if(
  23. b==')'||
  24. b==']'||
  25. b=='}'
  26. ){
  27. break;
  28. }
  29. }
  30. }
  31. return stack.empty();
  32. }
  33. }

二、逆波兰表达式求值

LeetCode——150.逆波兰表达式求值

要想做这类题目,首先要知道什么是逆波兰表达式(后缀表达式)。

我们生活中最常见的就是中缀表达式,举一个简单的例子:a+b*c+(d*e+f)*g

而如何将中缀表达式转换成后缀表达式呢?

首先,将中缀表达式用括号分开:( (  a+(b*c))+(((d*e)+f  )*g)    )

然后,将各个表达式中的预算符放到相对应的括号后面:

abc*+de*f+g*+

(前缀表达式同理)

前缀:++a*bc*+*defg

那我们如何计算这种后缀表达式呢?

将数字放入栈当中,碰到运算符则弹出栈顶元素,先弹出的放运算符右边,后弹出的放运算符左边,将运算好的结果放回到栈中,重复上述过程知道后缀表达式走完

  1. import java.util.Stack;
  2. class Solution {
  3. public int evalRPN(String[] tokens) {
  4. Stack<Integer> stack =new Stack<>();
  5. for(String n:tokens){
  6. if(n.equals("*")){
  7. int a=stack.pop();
  8. int b=stack.pop();
  9. stack.push(b*a);
  10. continue;
  11. }else if(n.equals("+")){
  12. int a=stack.pop();
  13. int b=stack.pop();
  14. stack.push(b+a);
  15. continue;
  16. }else if(n.equals("-")){
  17. int a=stack.pop();
  18. int b=stack.pop();
  19. stack.push(b-a);
  20. continue;
  21. }else if(n.equals("/")){
  22. int a=stack.pop();
  23. int b=stack.pop();
  24. stack.push(b/a);
  25. continue;
  26. }
  27. int m=Integer.valueOf(n);
  28. stack.push(m);
  29. }
  30. return stack.peek();
  31. }
  32. }

而同理,如果是让我们求前缀表达式的值,我们应从后往前遍历前缀表达式,将数字放入栈中,而碰到运算符,则弹出栈顶元素,注意:先弹出的元素此时应该放运算符的左边,后弹出的元素应该放运算符的右边,重复上述步骤,知道前缀表达式走完。

三、出栈入栈次序匹配

1、选择题之选择哪一种是正确的次序匹配函数

例:1.若进栈顺序为1,2,3,4,进栈过程中可以出栈,则下列不可能的一个出栈顺序为()

     A、1,4,3,2       B、2,3,4,1    C、3,1,4,2    D、3,4,2,1

答案:C

这类题目较简单,依次去排除就好了。 

2、编程题之判断出栈顺序是否存在可能

LeetCode——946.验证栈序列

 注意此题目入栈过程中可以出栈!

题目说明:

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

先将pushed数组中的数字依次入栈,如果栈顶元素与出栈数组中的数字匹配,则将栈顶元素出栈,否则入栈,如果当pushed数组遍历完成之后,栈中依旧存在元素,则返回false,否则返回true

  1. import java.util.Stack;
  2. class Solution {
  3. public boolean validateStackSequences(int[] pushed, int[] popped) {
  4. Stack<Integer> stack=new Stack<>();
  5. int j=0;
  6. int m=popped.length;
  7. for(int n:pushed){
  8. stack.push(n);
  9. while(!stack.empty()&&j<m&&popped[j]==stack.peek()){
  10. stack.pop();
  11. j++;
  12. }
  13. }
  14. return stack.empty();
  15. }
  16. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号