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”;



京公网安备 11010502036488号