zoukankan      html  css  js  c++  java
  • 算法刷题笔记-stack-四则运算

    题目描述:

    给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。

    示例 1:

    输入: "2-1-1"
    输出: [0, 2]
    解释:
    ((2-1)-1) = 0
    (2-(1-1)) = 2

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/different-ways-to-add-parentheses

    解题思路:

       1、每次仅运算乘除,将运算结果入栈,

        a、保留前一个运算符

        b、如果前一个运算符是乘除,弹出一个数字,与当前运算,结果回送。

        c、如果是减号,将当前数字取负,送进堆栈;正号,直接入栈

      2、扫描结束后,对栈中所有元素求和。结束

    java语言实现:

     1 class Solution {
     2     public static int calculate(String s) {
     3         int res = 0;
     4         int num = 0;
     5         char sign = '+';
     6         Stack<Integer> stack = new Stack<>();
     7         char[] sarr = s.toCharArray();
     8         for (int i = 0; i < sarr.length; i++) {
     9             if (sarr[i] >= '0') {
    10                 num = num * 10 + sarr[i] - '0'; // 注意字符变成数字,方可参加运算,否则直接ASCII码参与运算,出错。
    11             }
    12             if ((sarr[i] < '0' && sarr[i] != ' ') || i == sarr.length - 1) {
    13                 if (sign == '+') {
    14                     stack.push(num);
    15                 } else if (sign == '-') {
    16                     stack.push(-num);
    17                 } else if (sign == '*' || sign == '/') {
    18                     int top = stack.pop();
    19                     stack.push(sign == '*' ? top * num : top / num);
    20                 }
    21                 sign = sarr[i];
    22                 num = 0;
    23             }
    24         }
    25         while (!stack.isEmpty()) {
    26             res += stack.pop();
    27         }
    28         return res;
    29     }
    30 
    31     public static int calculate2(String s) {
    32        s=s.trim();  //清洗输入数据,并记得将洗过的数据回送给s
    33         java.util.Stack<Integer> stack = new java.util.Stack<>();
    34 //        String[] nums=s.split("[-+/*]");
    35         int left_number=0;
    36         char fuhao_before='+';  //保存前一个符号
    37         char fuhao;
    38         for (int i=0;i<s.length();i++){
    39             if (Character.isDigit(s.charAt(i))){
    40                 left_number=left_number*10+s.charAt(i)-'0';
    41 
    42             }if(i==s.length()-1 || ! Character.isDigit(s.charAt(i))){
    43                 fuhao=s.charAt(i);
    44                 switch (fuhao_before){
    45                     case '+':
    46                         stack.push(left_number);
    47                         fuhao_before=fuhao;
    48                         break;
    49                     case '-':
    50                         stack.push(-left_number);
    51                         fuhao_before=fuhao;
    52                         break;
    53                     case '*':
    54                         stack.push(stack.pop()*left_number);  //其实是右边的数
    55                         fuhao_before=fuhao;
    56                         break;
    57                     case '/':
    58                         stack.push(stack.pop()/left_number);
    59                         fuhao_before=fuhao;
    60                         break;
    61                     default:
    62                         break;
    63 
    64                 }
    65                 left_number=0; //归零
    66             }
    67         }
    68 
    69         int result=0;
    70         while (! stack.empty()){
    71             result+=stack.pop();
    72 
    73         }
    74         return result;
    75     }
    76 }

     

  • 相关阅读:
    oracle数据库创建表
    CMD下常用文件操作指令
    C#中int、long、float、double、decimal最大值最小值
    EF框架一对多 多对多关系总结
    如何用vue做网站,如何学习vue?--写两个经典的项目,算是入手
    swiper的使用方法,以及各种JS插件的使用通用技巧
    HTML快速布局技巧!编程的流程控制语句有三种,HTML又如何编写布局呢?
    CSS的移动端适配原理(一)-----屏幕是如何工作的(发光点原理),PC和手机的屏幕是如何渲染图片和文字
    JS语法糖总结----JS语法糖大全----一直更新
    PHPcms 客户定制的连表查询和结果排序的记录----2018-1-29 14:06
  • 原文地址:https://www.cnblogs.com/sqchao/p/11074147.html
Copyright © 2011-2022 走看看