博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
栈的应用(前缀中缀后缀转换)
阅读量:4648 次
发布时间:2019-06-09

本文共 2600 字,大约阅读时间需要 8 分钟。

 

class Stack:    def __init__(self):        self.items=[]    def isEmpty(self):        return self.items==[]    def push(self,item):        #添加元素进站        self.items.append(item)    def peek(self):        #打印栈顶元素        return self.items[len(self.items)-1]    def pop(self):        #从栈顶取出元素        return self.items.pop()    def size(self):        #返回栈中元素的个数        return len(self.items)def infixToPostfix(infixexpr):    # prec字典存储着运算符的优先级    prec = {}    prec["*"] = 3    prec["/"] = 3    prec["+"] = 2    prec["-"] = 2    prec["("] = 1    # 定义空栈存储运算符出栈和进栈操作结果    openStack = Stack()    # 存储最后的后缀表达式的结果list    postficList = []    # tokenList存储将表达式分割字符后的list,要求表达式中的字符之间必须有空格    tokenList = infixexpr.split()    for token in tokenList:        # 只要分割的字符在A-Z或者阿拉伯数字0-9之间放到postficList        if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token.isnumeric():            #isnumeric()方法判断token是否是数字            postficList.append(token)            # 左括弧匹配        elif token == '(':            openStack.push(token)        elif token == ')':            toptoken = openStack.pop()            # 非括弧符号匹配            while toptoken != '(':                postficList.append(toptoken)                toptoken = openStack.pop()        else:            # 运算符优先级比较            while (not openStack.isEmpty()) and (prec[openStack.peek()] >= prec[token]):                postficList.append(openStack.pop())            openStack.push(token)    while not openStack.isEmpty():        postficList.append(openStack.pop())    return " ".join(postficList)def postfixEval(postfixExpr):    #后缀表达式的计算    operandStack=Stack()    tokenList=postfixExpr.split()    #对表达式进行分离    for token in tokenList:        if token.isnumeric():            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    elif op=="/":        return op1/op2    elif op=="+":        return op1+op2    else:        return op1-op2if __name__ == '__main__':    print(infixToPostfix("A * B + C * D"))    print(infixToPostfix("( ( A * B ) + ( C * D ) )"))    print(infixToPostfix("A + B * C + D"))    print(infixToPostfix("( A + B ) * ( C + D )"))    print(infixToPostfix("A * B + C * D"))    print(infixToPostfix("83 * 9 + 4"))    postresult=infixToPostfix("70 * 9 + 4")    #print(postresult)    print(postfixEval(postresult))
View Code

 

转载于:https://www.cnblogs.com/jzxs/p/11090723.html

你可能感兴趣的文章
SecureCRT突然卡死的问题
查看>>
DevExpress.XtraGrid.Views.Grid.GridView 选中行焦点的滚动条的位置
查看>>
Android类参考---Fragment(五)
查看>>
【Web动画】SVG 实现复杂线条动画
查看>>
修改mysql数据库默认存储引擎和默认编码
查看>>
[TJOI2009] 战争游戏
查看>>
eclipse error
查看>>
微信小程序运行机制
查看>>
安卓新发布机制----app bundle
查看>>
3. 设计模式之创建模式
查看>>
python学习笔记-day6-【python如何写excel表】
查看>>
Switch的簡化
查看>>
tensorflow学习笔记一:安装调试
查看>>
(转自ztp800201) Android - 自定义标题栏(在标题栏中增加按钮和文本居中)
查看>>
领扣简单版--两数之和(Two Sum)
查看>>
第10月第25天 java annotation
查看>>
Spark- SparkSQL中 Row.getLong 出现NullPointerException错误的处理方法
查看>>
9.28 作业 6
查看>>
23. Merge k Sorted Lists
查看>>
CentOS7配置JAVA环境变量
查看>>