后缀表达式计算

2020-03-11  本文已影响0人  C调路过
/**
 * 优先级  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;
    }
}

上一篇 下一篇

猜你喜欢

热点阅读