public int Calculate(string s) { var exp = s.Where(c => c != ‘ ‘).ToList(); var stackOp = new Stack<char>(); var stackNum = new Stack<int>(); var ops = new []{‘+‘,‘-‘,‘*‘,‘/‘}; var n = ""; for(var i = 0;i < exp.Count; i++){ if(ops.Contains(exp[i])) // detected operator { stackOp.Push(exp[i]); } else{ // parse the number for(var j = i;j < exp.Count; j++){ if(!ops.Contains(exp[j])){ n += exp[j]; } else{ break; } } var n1 = int.Parse(n); // if top is ‘*‘ or ‘/‘ , immediately calculate if(stackOp.Count > 0 && (stackOp.Peek() == ‘*‘ || stackOp.Peek() == ‘/‘)){ var n2 = stackNum.Pop(); stackNum.Push(Calc(n2, n1, stackOp.Pop())); } else{ stackNum.Push(n1); } i += n.Length - 1; n = ""; } } // since now we only left ‘+‘ and ‘-‘ // we should reverse the order (both operators and numbers) back to where they were var stackOp1 = stackOp.Reverse(); var stackNum1 = new Stack<int>(stackNum); var count = 0; foreach(var op in stackOp1){ var n1 = stackNum1.Pop(); var n2 = stackNum1.Pop(); stackNum1.Push(Calc(n1 , n2, op)); count += 2; } return stackNum1.Pop(); } private int Calc(int n1 , int n2, char op) { switch(op){ case ‘+‘: return n1 + n2; case ‘-‘: return n1 - n2; case ‘*‘: return n1 * n2; case ‘/‘: return n1 / n2; default : throw new ArgumentException(string.Format("unexpected operator : {0}", op)); } }
LeetCode -- Basic Calculator II
原文:http://blog.csdn.net/lan_liang/article/details/49962137