您的位置:

波兰表达式的全面解析

一、波兰表达式c

波兰表达式也叫前缀表达式,是一种不需要括号即可表示复杂运算的表达式。以波兰数学家Jan Łukasiewicz的名字命名。和我们平时所写的算术表达式中缀表达式有所不同,波兰表达式的运算符位于操作数之前。

波兰表达式的一般形式为:“运算符 操作数1 操作数2” ,例如中缀表达式(1+2)*3对应的波兰表达式为*+123。

二、波兰表达式解析逻辑运算符

对于中缀表达式中的逻辑运算符(&&,||,!),我们可以通过波兰表达式来替换掉这些运算符,即用对应的波兰表达式来表示逻辑运算符的运算关系。其中,&&对应and,||对应or,!对应not,具体可以参考下表。

逻辑运算符 	中缀表达式 	波兰表达式
&&       a && b       & a b
||       a || b       | a b
!        !a           ! a 

三、波兰表达式代码

下面是一个简单的波兰表达式计算的Python代码示例:

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            if token in ["+", "-", "*", "/"]:
                a = stack.pop()
                b = stack.pop()
                if token == "+":
                    stack.append(b + a)
                elif token == "-":
                    stack.append(b - a)
                elif token == "*":
                    stack.append(b * a)
                else:
                    stack.append(int(b / a))
            else:
                stack.append(int(token))
        return stack[0]

四、波兰表达式与二叉树

波兰表达式可以通过二叉树来表示,二叉树的结点表示运算符或操作数,左结点和右结点分别表示运算符或操作数的左侧和右侧。二叉树的叶结点都是操作数。比如表达式(8-3)*(2+6)的二叉树表示如下:

            *
          /   \
        -      +
      /  \    / \
     8    3  2   6

五、波兰表达式怎么算

计算波兰表达式通常使用栈来实现,从左到右遍历表达式,如果是一个操作数,则入栈,如果是一个运算符,则取出栈顶的两个元素进行运算,并把运算结果入栈。当表达式遍历完成后,栈中的唯一元素就是表达式的计算结果。比如计算波兰表达式(2,1,+,3,*)的结果可以按照以下步骤来实现:

1. 将2和1压入栈中;
2. 弹出2和1(1在栈顶),计算2+1,结果为3,将3压入栈中;
3. 将3和3压入栈中;
4. 弹出3和3(3在栈顶),计算3*3,结果为9,将9压入栈中;
5. 栈中的唯一元素9就是表达式的计算结果。

六、波兰表达式是什么

波兰表达式是将运算符前置的一种数学表达式,由波兰数学家Jan Łukasiewicz于1920年提出并命名。波兰表达式有着与中缀表达式类似的计算结果,但由于运算符的位置不同,波兰表达式更适用于计算机处理。

七、波兰表达式怎么写

在使用时,可以按照以下步骤将中缀表达式转换为波兰表达式:

1. 创建一个运算符栈和一个结果栈;
2. 从左到右遍历中缀表达式中的每个元素;
3. 如果遇到操作数,将其压入结果栈中;
4. 如果遇到运算符,则与运算符栈顶的元素进行比较:
   4.1 如果该运算符的优先级高于运算符栈顶的元素,则将该运算符压入运算符栈中;
   4.2 如果该运算符的优先级低于或等于运算符栈顶的元素,则不断弹出运算符栈顶的元素,直到遇到优先级低于该运算符的元素,然后将该运算符压入运算符栈中;
5. 如果遇到左括号,将其压入运算符栈中;
6. 如果遇到右括号,则连续弹出运算符栈顶元素并压入结果栈中,直到弹出的元素是左括号为止;
7. 遍历完成后,如果运算符栈中仍有元素,则依次弹出并压入结果栈中;
8. 将结果栈中的元素逆序输出即得到波兰表达式。

八、波兰表达式前中后的区别

波兰表达式有前缀、中缀和后缀(逆波兰)三种形式,中缀表达式是人们最为熟悉的,并且使用得也最多,但计算机计算的时候需要先转化为其他形式再进行计算。波兰表达式与中缀表达式之间的转换主要包括:

中缀表达式 -> 前缀表达式:使用不断弹出栈顶元素的方法,将中缀表达式转换为前缀表达式;
中缀表达式 -> 后缀表达式:使用不断弹出栈顶元素的方法,将中缀表达式转换为逆波兰表达式;
前缀表达式 -> 中缀表达式:使用递归的方法将前缀表达式转换为中缀表达式;
后缀表达式 -> 中缀表达式:使用递归的方法将后缀表达式转换为中缀表达式。

九、波兰表达式和逆波兰表达式定义

波兰表达式通常指前缀表达式,也称为波兰记法,是一种将运算符写在前面的算术表达式。逆波兰表达式通常指后缀表达式,也称为逆波兰记法,是一种将运算符写在后面的算术表达式。逆波兰表达式与波兰表达式类似,但运算符位于操作数之后。例如,中缀表达式 (1+2)*(3+4) 可以写成逆波兰表达式 1 2 + 3 4 + *

十、波兰表达式例题

1、LeetCode 150. Evaluate Reverse Polish Notation

给定一个代表逆波兰表达式的字符串,求表达式的值。可以假设给定的逆波兰表达式始终有效,且所有中间结果的计算值在范围 [-2^31, 2^31 - 1] 内。

示例:

输入: ["2", "1", "+", "3", "*"]
输出: 9

AC代码如下:

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            if token in ["+", "-", "*", "/"]:
                a = stack.pop()
                b = stack.pop()
                if token == "+":
                    stack.append(b + a)
                elif token == "-":
                    stack.append(b - a)
                elif token == "*":
                    stack.append(b * a)
                else:
                    stack.append(int(b / a))
            else:
                stack.append(int(token))
        return stack[0]

2、LeetCode 224. Basic Calculator

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。示例 1:

输入:s = "1 + 1"
输出:2

AC代码如下:

class Solution:
    def calculate(self, s: str) -> int:
        num = 0 # 维护一个当前的数字
        stack = [1] # 维护一个存放+,-号的栈,遇到左括号的时候入栈最后结果 * 对应的数字
        sign = 1 # 维护当前的符号
        res = 0 # 维护最终的结果
        for i in range(0, len(s)):
            if s[i].isdigit():
                num = num * 10 + int(s[i])
            elif s[i] == '+':
                res += sign * num
                num = 0
                sign = stack[-1]
            elif s[i] == '-':
                res += sign * num
                num = 0
                sign = -1 * stack[-1]
            elif s[i] == '(':
                stack.append(sign)
            elif s[i] == ')':
                stack.pop()
            else:
                continue
        res += sign * num
        return res

3、LeetCode 439. Ternary Expression Parser

给一个字符串表示一个三元表达式,求它的计算结果。表达式由字符串组成,其中的操作符将提供为字符。条件运算符 ? 总是以双字符 ' ? ' 和 ' : ' 的形式出现在表达式中。

示例:

输入: "T?2:3"
输出: 2

AC代码如下:

class Solution:
    def parseTernary(self, expression: str) -> str:
        if len(expression) == 1:
            return expression
        i = 0
        count = 0
        # 用来统计?和:的数量,记录下当前的数字
        for i in range(len(expression)):
            if expression[i] == "?":
                count += 1
            elif expression[i] == ":":  
                count -= 1

            if count == 0:
                idx = i
                break
                
        return self.parseTernary(expression[2:idx+1]) if expression[0]=="T" else self.parseTernary(expression[idx+1:])