用scala语言写一段中缀表达式转后缀表达式的代码
时间: 2023-12-17 17:50:58 浏览: 200
数据结构 中缀转后缀的代码
4星 · 用户满意度95%
以下是用Scala语言实现中缀表达式转后缀表达式的代码:
```scala
import scala.collection.mutable.Stack
def infixToPostfix(infix: String): String = {
val operatorStack = Stack[Char]()
var postfix = ""
for (c <- infix) {
if (c.isDigit) {
postfix += c
} else if (c == '(') {
operatorStack.push(c)
} else if (c == ')') {
while (operatorStack.top != '(') {
postfix += operatorStack.pop()
}
operatorStack.pop()
} else {
while (operatorStack.nonEmpty && precedence(operatorStack.top) >= precedence(c)) {
postfix += operatorStack.pop()
}
operatorStack.push(c)
}
}
while (operatorStack.nonEmpty) {
postfix += operatorStack.pop()
}
postfix
}
def precedence(operator: Char): Int = {
operator match {
case '+' | '-' => 1
case '*' | '/' => 2
case _ => 0
}
}
```
注释:
- `infixToPostfix`函数接受一个中缀表达式字符串作为参数,并返回一个后缀表达式字符串。
- `operatorStack`是一个可变栈,用于存储运算符。
- `postfix`是一个字符串,用于存储后缀表达式。
- `for`循环遍历中缀表达式字符串中的每一个字符。
- 如果字符是数字,则直接追加到后缀表达式字符串中。
- 如果字符是左括号,则将其压入运算符栈中。
- 如果字符是右括号,则弹出运算符栈中的运算符,直到遇到左括号为止,并将这些运算符追加到后缀表达式字符串中。
- 如果字符是运算符,则弹出运算符栈中优先级大于等于该运算符的所有运算符,并将这些运算符追加到后缀表达式字符串中,最后将该运算符压入运算符栈中。
- 循环结束后,如果运算符栈中仍有运算符,则依次弹出并追加到后缀表达式字符串中。
- `precedence`函数用于返回运算符的优先级,其中优先级高的运算符返回较大的整数值。
阅读全文