关闭

SPOJ 4. Transform the Expression

489人阅读 评论(0) 收藏 举报

将中缀表达式转换为后缀表达式,大家应该都很熟悉。具体过程为先为可能出现的括号和操作符('(','+','-','*','/‘,'^'等)赋一个优先级,其中'('优先级最低。然后顺次扫描输入的表达式(即字符串),

1. 碰到'('时,直接入栈

2. 碰到操作符时,如果优先级大于栈顶操作符的优先级,则入栈,否则将其直接输出

3. 碰到')'时,将栈中的所有操作符出栈直到碰到'('时为止,但并不输出'('

4. 对于操作数直接输出

算法涉及四种输入(左括号,右括号,操作符和操作数)和两种操作(入栈和持续出栈)。另外就是语言方面,python的print默认是换行的,虽然在语句后加逗号可以在同一行,但是会在逗号后加一个空格,如果要既不换行也不加空格,网上的方法都是用sys.stdout.write()。此外,input()和raw_input()最大的区别就是input()返回一个整数而raw_input()返回的是字符串。要访问字符串中的每个字符,在python中可以直接用for c in str。

import sys

priority={'(':0,'+':1,'-':2,'*':3,'/':4,'^':5}
stack=[]
t=input()
while t:
    exp=raw_input()
    for c in exp:
        if c=='(':
            stack.append(c)
        elif c==')':
            while 1:
                p=stack.pop()
                if p<>'(':
                    sys.stdout.write(p)
                else:
                    break;
        elif c=='+' or c=='-' or c=='*' or c=='/' or c=='^':
            if priority[c]>priority[stack[-1]]:
                stack.append(c)
            else:
                sys.stdout.write(c)
        else:
            sys.stdout.write(c)
    print
    t=t-1



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:89573次
    • 积分:1453
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:11篇
    • 译文:0篇
    • 评论:23条
    文章分类
    最新评论