# 實現四則混合運算的代碼

string Precede(string p, string q)
{
switch(p)
{
case "+":
case "-":
return ("*/(".IndexOf(q) != -1) ? "<":">";
case "*":
case "/":
return (q == "(") ? "<":">";
case "(":
return (q == ")") ? "=":"<";
case ")":
return (q == "(") ? "?":">";
case "#":
return (q == "#") ? "=":"<";
}
return "?";
}

double Operate(double a, char o, double b)
{
switch(o)
{
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
}
return 0;
}

object Compute(string expression)
{
Stack nArr = new Stack(), oArr = new Stack();
int j = 0;
Double a = 0, b = 0;
string w = "";
char o;
MatchCollection arr = Regex.Matches(expression.Replace(" ", "") + "#", @"(((?<=(^|\())-)?\d+(\.\d+)?|\D)");

oArr.Push("#");
w = Convert.ToString(arr[j++]);
while(!(w == "#" && Convert.ToString(oArr.Peek()) == "#"))
{
if("+-*/()#".IndexOf(w) != -1)
{
switch(Precede(oArr.Peek().ToString(), w))
{
case "<":
oArr.Push(w);
w = Convert.ToString(arr[j++]);
break;
case "=":
oArr.Pop();
w = Convert.ToString(arr[j++]);
break;
case ">":
o = Convert.ToChar(oArr.Pop());
b = Convert.ToDouble(nArr.Pop());
a = Convert.ToDouble(nArr.Pop());
nArr.Push(Operate(a, o, b));
break;
default:
return "計算出錯！";
}
}
else
{
nArr.Push(w);
w = Convert.ToString(arr[j++]);
}
}
return nArr.Pop();
}

## E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

## Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

## Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth \$300-1200 USD