逆波兰式(无括号)

 任务:

编程实现中缀算术表达式转换为逆波兰表达式

输入:中缀式

输出:逆波兰式

只考虑简单运算式,包括四种运算符+-*/

基本思路:

1.定义一个栈,最初栈为空;

2、定义s1串,放入中缀表达式,表达式以#结尾;

3、定义s2串,用来放入逆波兰表达式;

4、从头到尾地扫描中缀表达式( s1串)中的每个字符,对于不同类型的字符按以下情况进行处理: (1)若遇到的是空格则认为是分隔符,不需要进行处理; (2)若遇到的是操作数直接写入s2串中(3)若遇到的是运算符: 如果栈为空,直接入栈; 当该运算符的优先级大于栈顶运算符的优先级(加减运算符的优先级设定为1,乘除运算符的优先级设定为2)时,表明该运算符的后一个运算对象还没有被扫描并放入到s2串中,应把它暂存于栈中,待它的后一个运算对象从s1串中读出并写入到s2串中后,再令其出栈并写入s2串中;若遇到的运算符的优先级小于等于栈顶运算符的优先级,这表明栈顶运算符的两个运算对象已经被保存到s2串中,应将栈顶运算符退栈并写入到s2串中,对于新的栈顶运算符仍继续进行比较和处理,直到被处理的运算符的优先级大于栈顶运算符的优先级为止,然后令该运算符进栈即可。(4)如果s1串扫描完毕,栈内有运算符,依次出栈,写入s2串。 (5)输出s2串。

注意:

 

栈中:

 

 

#!/use/bin/python
# _*_ coding: UTF-8 _*_
"""
@author:YLFeng
@file:逆波兰式
@time:2022/9/28 18:30
"""

class Stack():
    def __init__(self,size):
        self.size=size
        self.stack=[]
        self.top=-1
        self.bottom=-1

    def push(self,x):
        if self.isfull():
            print("stack is full")
            return False
        else:
            self.stack.append(x)
            self.top=self.top+1
            return True

    def pop(self):
        if self.isempty():
            print("stack is empty")
            return False
        else:
            self.top=self.top-1
            self.stack.pop()
            return True

    def get(self,y):
        if self.top!=-1:
            return self.stack[self.bottom+int(y)]

    def gettop(self):
        if self.top!=-1:
            return self.stack[self.top]

    def isempty(self):
        return self.top=='-1'

    def isfull(self):
        return self.top+1==self.size

    def showStack(self):
        print(self.stack)


s1=str(input())
a=Stack(len(s1))
s2=""
#for i in range(100):
#    n=input()
#    if n=="#":
#         break
#    a1.push(n)
for j in range(1,len(s1)+1):
    m=s1[j-1:j]
    if m=='+' or m=='-' or m=='*' or m=='/':#运算符
        if a.top==-1:#有问题T or F
            a.push(m)
        elif a.get(len(a.stack))=='*' or a.get(len(a.stack))=='/':
            while a.top!=-1:
                s2 = s2 + str(a.gettop())
                a.pop()

            a.push(m)
        elif a.get(len(a.stack))=='+' or a.get(len(a.stack))=='-':
            if m=='*' or m=='/':
                a.push(m)
            else:
                s2=s2+str(a.gettop())
                a.pop()
                a.push(m)
    elif m != '*' and m != '/' and m != '+' and m != '-':  # 直接读入操作数
        s2 = str(s2+m)
        

for i in range(1,a.top+2):
    if a.top!=-1:
        s2=str(s2+str(a.gettop()))
        a.pop()
    else:
        break
print(s1)
print(s2)

#a.showStack()
#print(len(a.stack))

结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值