规则:从左到右遍历中缀表达式,
①如果是数字就直接输出成为后缀表达式的一部分;
②如果是运算符号,则判断它与栈顶的优先级,如果栈为空或栈顶符号优先级低于等于它或是左括号,就将它入栈,否则输出所有优先级大于等于它的运算符号直到栈空或遇到左括号。
③如果是左括号,直接入栈。
④如果是右括号,匹配到前面的左括号,输出之间的运算符号
//计算出后缀表达式
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;
}