/**
* 优先级 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;
}
}
网友评论