class Program { static void Main(string[] args) { var source = "5+2*2-3*4/2"; var result = Cal(source); Console.WriteLine(result); } static int Cal(string str) { var numStack = new Stack<int>();//存储数字的栈 var opStack = new Stack<char>();//存储操作符的栈 int result; foreach (var c in str) { if (IsNumeric(c, out var i)) { numStack.Push(i); continue; } while (opStack.Count > 0) { var f = Check(c, opStack); if (f) { break; } result = Cal(numStack, opStack); numStack.Push(result); } opStack.Push(c); } result = Cal(numStack, opStack); numStack.Push(result); return result; } /// <summary> /// 判断是否是数字 /// </summary> /// <param name="c"></param> /// <param name="i"></param> /// <returns></returns> static bool IsNumeric(char c, out int i) { var pattern = @"^d+$"; var rgx = new Regex(pattern); var flag = rgx.IsMatch(c.ToString()); i = 0; if (flag) { i = Convert.ToInt32(c.ToString()); } return flag; } /// <summary> /// 判断当前操作符的优先级是否高于栈顶的操作符 /// </summary> /// <param name="c"></param> /// <param name="opStack"></param> /// <returns></returns> static bool Check(char c, Stack<char> opStack) { char op = opStack.Peek(); if (op == '*' || op == '/') { return false; } if (c == '*' || c == '/') { return true; } return false; } /// <summary> /// 计算 /// </summary> /// <param name="numStack"></param> /// <param name="opStack"></param> /// <returns></returns> static int Cal(Stack<int> numStack, Stack<char> opStack) { var num1 = numStack.Pop(); var num2 = numStack.Pop(); char op = opStack.Pop(); switch (op) { case '+': return num2 + num1; case '-': return num2 - num1; case '*': return num2 * num1; case '/': return num2 / num1; default: throw new Exception("not valid op"); } } }