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 }

     

  • 相关阅读:
    ionic localstorage
    angular 中文鏈接
    把jqmobi 變成jQuery 的插件 從此使用jQuery
    jqmobi 的一些設置
    ionic ngcordova map 地圖
    ionic pull to refresh 下拉更新頁面
    json 對象的序列化
    鍵盤彈出,頁面佈局被推上去了.....
    Cordova V3.0.0中config.xml配置文件的iOS Configuration
    android ios 只能輸入數字 不能輸入小數點的 函數 cordova
  • 原文地址:https://www.cnblogs.com/sqchao/p/11074147.html
Copyright © 2011-2022 走看看