深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
想要了解具题后缀的相关知识点点击👉🔗http://t.csdnimg.cn/9100K
中缀转前缀思路也类似,不过
中缀表达式中运算符的优先级和结合性需要考虑,从左往右扫描的话,需要对每个运算符的优先级和结合性进行判断,才能决定是否需要先进行计算。这样会增加算法的复杂度。
而****从右往左扫描,则可以利用栈的特性,遇到运算符时先将其压入栈中,再比较栈顶运算符的优先级和结合性,来决定是否需要先进行计算。这样可以简化算法,提高效率。另外,从右往左扫描还可以处理右结合性的运算符。
参考后缀表达式代码思路:
我们利用一个栈来进行中缀表达式转前缀表达式的操作。其中prec{}是一个字典,用于记录操作符的优先级,优先级由低到高依次为1~3。opStack是我们初始化的操作符栈,prefixList是用于储存前缀表达式的空列表。
我们首先将中缀表达式解析为一个tokenList列表,并反转该列表,这样我们就可以正向扫描这个列表。
在扫描过程中,对于每个操作数token,我们需要分别处理三种情况:
- 操作数–将其添加到前缀表达式列表prefixList中。
- 右括号–将其压入操作符栈opStack中。
- 左括号–从操作符栈opStack中弹出并返回顶部元素topToken,直到遇到右括号为止。期间,将所有弹出的操作符添加到前缀表达式列表prefixList中。
对于第4种情况—操作符,
我们需要通过while循环语句比较操作符的优先级。
如果当前操作符的优先级小于等于栈顶操作符的优先级,我们就将栈顶操作符弹出并添加到前缀表达式列表prefixList中。然后将当前操作符压入操作符栈opStack中
(1)中缀表达式转前缀
class Stack :
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self,item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items) - 1]
def size(self):
return len(self.items)
def infix_to_prefix(infix_expr):
# 定义一个空字典prec{}--记录操作符优先级 -- 优先级由低到高是1~3
prec = {}
prec["*"] = 3
prec["/"] = 3
prec["+"] = 2
prec["-"] = 2
prec[")"] = 1
opStack = Stack()#初始化操作符栈
#初始化列表用于储存前缀表达式
prefixList = []
#将中缀表达式解析为一个 tokenList 列表,并反转该列表
tokenList = infix_expr.split()[::-1]#利用split切割成一个一个,然后通过切片转置到列表里
#列表的元素为:c + ) B + A ( 遇到右括号入栈,左计算
for token in tokenList:
#若token是操作数---添加到列表
if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789":
prefixList.append(token)
# )---压入操作符栈
elif token == ")":
opStack.push(token)
# (---从操作符栈opStack中弹出并返回顶部元素topToken
elif token == "(":
topToken = opStack.pop()
#当topToken不是")"
while topToken != ")":
prefixList.append(topToken)
topToken = opStack.pop()
# 若token是操作符,通过while循环语句比较他们的优先级,大的操作符添加到式子末端
else:
while (not opStack.isEmpty()) and \
(prec[opStack.peek()] > prec[token]):
#opStack.pop()会直接把栈顶元素弹出并返回
prefixList.append(opStack.pop())
opStack.push(token)
#扫描完后将栈中的元素弹出
while not opStack.isEmpty():
# 操作符
prefixList.append(opStack.pop())
# 将后缀表达式通过切片转置合成前缀表达式字符串
return " ".join(prefixList[::-1])
print(infix_to_prefix("A + B * C "))
(2) 前缀表达式求值
def postfix_eval(prefix_expr):
operandStack = Stack()
tokenList = prefix_expr.split()
for token in reversed(tokenList):
if token in "0123456789":#遇到操作数,入栈
operandStack.push(int(token))
else:
operand2 = operandStack.pop()
operand1 = operandStack.pop()
result = doMath(token,operand1,operand2)
operandStack.push(result)
return operandStack.pop()
def doMath(op, op1, op2):
if op == "*":
return op1 * op2
**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**



**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618636735)**
的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618636735)**