using System; using System.Collections.Generic; using System.Linq; class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ public int solve (string s) { // write code here return cal(s); } public int cal(string s) { int sum = 0; char sign = '+'; int i = 0; Stack<int> nums = new Stack<int>(); while(i<s.Length) { if(s[i]=='(') { int flag = 1; int startIndex = i + 1; while(flag>0) { i++; if (s[i] == '(') flag++; if (s[i] == ')') flag--; } sum=cal(s.Substring(startIndex,i-startIndex)); i--; //这儿做减号是为了下一轮循环到')'时.将运算结果入栈 } else if(char.IsDigit(s[i])) { sum = sum * 10 + (s[i] - '0'); } if(!char.IsDigit(s[i]) || i==s.Length-1) { if (sign == '+') nums.Push(sum); if (sign == '*') nums.Push(sum * nums.Pop()); if (sign == '-') nums.Push(sum*(-1)); sum = 0; sign = s[i]; } i++; } return nums.Aggregate(0, (total, next) => total + next); } }
C# 求值的递归版,遇到括号先算括号内的,遇到符号则计算符号,并讲计算结果入栈。更新符号。2个注意点:初始符号为“+”号,初始和为0,等价与引申计算表达书为 :0+“s”;