美文网首页
后缀表达式计算

后缀表达式计算

作者: C调路过 | 来源:发表于2020-03-11 23:13 被阅读0次
/**
 * 优先级  0:( )
 *         1: + -
 *         2: * /
 *
 * 跟字节码计算相同,遇到符号取栈中两个数字进行计算后压会栈顶
 */
fun main(args: Array<String>) {
    var pattern: String = "2*(2+1)-6/(4-2)"

    var numStack: Stack<Float> = Stack()
    var symbolStack: Stack<Char> = Stack()

    for (s in pattern) {
        if (s.isDigit()) {
            numStack.push((s.toFloat() - 48))
        } else {
            var flag = false

            // 左括号无条件加入
            if (s?.equals('(')) {
                symbolStack.push(s)
                continue
            }
            while (!symbolStack.isEmpty() && !flag) {
                //右括号逐个弹出直到左括号
                if (s?.equals(')')) {
                    var c = symbolStack.pop()
                    if (c.equals('(')) {
                        flag = true
                    } else {
                        var r = operation(numStack, c)
                        numStack.push(r)
                    }
                } else {
                    var c = symbolStack.pop()
                    //若符号栈内优先级较高或者相等就弹出
                    if ((s.equals('+') || s.equals('-')) && !c.equals('(')) {

                        var r = operation(numStack, c)
                        numStack.push(r)
                    } else if ((s.equals('*') || s.equals('/')) && (c.equals('*') || c.equals('/'))) {
                        var r = operation(numStack, c)
                        numStack.push(r)
                    } else {
                        symbolStack.push(c)
                        flag = true
                    }
                }
            }
            if (!s?.equals(')')) {
                symbolStack.push(s)
            }
        }
    }

    while (!symbolStack.isEmpty()) {
        var r = operation(numStack, symbolStack.pop())
        numStack.push(r)
    }
    println(numStack.pop())
}

fun operation(numStack: Stack<Float>, op: Char): Float {
    var b = numStack.pop();
    var a = numStack.pop();
    if (op.equals('+')) {
        return a + b;
    } else if (op.equals('-')) {
        return a - b;
    } else if (op.equals('*')) {
        return a * b;
    } else {
        return a / b;
    }
}

相关文章

  • day06-逆波兰表达式的计算器

    目标:完成一个逆波兰表达式的计算器(分为两个步骤)计算后缀表达式:中缀表达式转成后缀表达式: 1.计算后缀表达式:...

  • 逆波兰计算器

    中缀表达式转换成后缀表达式 后缀表达式的计算 逆波兰计算器 先挖坑,学年设计之后再来填坑。

  • 计算器

    使用Java写的一个可以计算+,-,*,/ 的计算器。首先用栈把中缀表达式转化成后缀表达式,再利用栈对后缀表达式求...

  • [堆栈] 前, 中, 后缀表达式

    将中缀表达式转换成后缀表达式(逆波兰式), 便于计算机的计算.

  • 机试常用算法和题型-栈和队列专题

    堆栈+ordermap使用括号匹配 堆栈使用简单计算器 栈+队列实现中缀转后缀,计算后缀表达式 栈+队列计算,包括...

  • 堆栈

    堆栈中常见的问题: 问题1: 后缀表达式怎么计算?问题2: 中缀表达式怎么转换成后缀表达式?问题3: 回溯算法问题...

  • Python 简单计算器-逆波兰后缀表达式实现

    中缀表达式 后缀表达式 简易计算器,可以通过栈来实现。然而如果直接使用中缀表达式,需要处理括号,而使用后缀表达式则...

  • 栈的应用

    中缀表达式转换为后缀表达式 后缀表达式 做数学运算时,经常使用的是中缀表达式,即“操作数 运算符 操作数”。在计算...

  • 计算器专题

    0X00 基础知识 后缀表达式的计算 150. 逆波兰表达式求值 后缀表达式就是这么简单粗暴,碰到一个符号,就从栈...

  • 深度透析逆波兰表达式

    逆波兰表达式 1、概念 标准四则运算表达式---中缀表达式 计算机采用一种计算,变成后缀表达式: 2、计算机进行转...

网友评论

      本文标题:后缀表达式计算

      本文链接:https://www.haomeiwen.com/subject/upikjhtx.html