栈和计算器-中缀转后缀

规则:从左到右遍历中缀表达式,

①如果是数字就直接输出成为后缀表达式的一部分;

②如果是运算符号,则判断它与栈顶的优先级,如果栈为空或栈顶符号优先级低于等于它或是左括号,就将它入栈,否则输出所有优先级大于等于它的运算符号直到栈空或遇到左括号。

③如果是左括号,直接入栈。

④如果是右括号,匹配到前面的左括号,输出之间的运算符号

//计算出后缀表达式
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;
}

首页 我的博客
粤ICP备17103704号