规则:从左到右遍历中缀表达式,
①如果是数字就直接输出成为后缀表达式的一部分;
②如果是运算符号,则判断它与栈顶的优先级,如果栈为空或栈顶符号优先级低于等于它或是左括号,就将它入栈,否则输出所有优先级大于等于它的运算符号直到栈空或遇到左括号。
③如果是左括号,直接入栈。
④如果是右括号,匹配到前面的左括号,输出之间的运算符号
//计算出后缀表达式 private bool TranformMidToLater() { int eleLength = this._elements.GetListLength(); if (eleLength == 0) { return false; } for (int i = 1; i <= eleLength; i++) { string element = ""; this._elements.GetElement(i, ref element); if (element == "(") { this._midStack.Push(element); continue; } if (element == ")") { //匹配前面的左括号 string e = ""; this._midStack.Pop(ref e); while (e != "(") { this._laterString.Add(e); this._midStack.Pop(ref e); } continue; } if (element == "+" || element == "-") { if (this._midStack.GetLength() == 0) { //栈中没有元素 this._midStack.Push(element); continue; } //获取栈顶元素 string e = ""; this._midStack.GetTop(ref e); if (e == "*" || e == "/") { //栈顶符号优先级较高,输出 while (e != "(" && this._midStack.GetLength() != 0) { this._midStack.Pop(ref e); this._laterString.Add(e); this._midStack.GetTop(ref e); } } this._midStack.Push(element); continue; } if (element == "*" || element == "/") { this._midStack.Push(element); continue; } //剩下就是数字了 //直接输出 this._laterString.Add(element); //判断是否为最后一个数字 if (i == eleLength) { //将中专栈中的符号全部输出 while (this._midStack.GetLength() > 0) { string e = ""; this._midStack.Pop(ref e); this._laterString.Add(e); } } } return true; }