--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2007/06/13

[今日のスクリプト] 逆ポーランド記法計算機

よくあるネタ。del explist[i-1]のところとかかなりいやらしいのでもうちょっと綺麗にまとめたい。

処理の指針は

  • 現在の文字が演算子ならば、2つ前の値と1つ前の値について現在の文字の演算子で計算する。2つ前のところに計算結果を挿入し、1つ前と現在の文字は消去する。
  • 現在の文字が演算子でなければ、添字を進ませ次に行く。

という感じ

#!/usr/bin/python
#coding:utf-8

oplist = ("+","-","*","/")

def rpn(exp):
    explist = exp.split()
    i = 0
    while i < len(explist):
        if explist[i] in oplist:
            explist[i-2] = calc(explist[i-2], explist[i-1], explist[i])
            del explist[i-1]
            del explist[i-1]
            i -= 1
        else:
            i += 1
    return explist[0]

def calc(n, m, op):
    if op == "+":
        return str(int(n)+int(m))
    elif op == "-":
        return str(int(n)-int(m))
    elif op == "*":
        return str(int(n)*int(m))
    elif op == "/" and m != 0:
        return str(int(n)/int(m))

print "(6 3 2 + * 5 -)=" + rpn("6 3 2 + * 5 -")
print "(3 2 -)=" + rpn("3 2 -")
print "(6 4 3 2 + * / 5 -)=" + rpn("6 4 3 2 + * / 5 -")

結果

(6 3 2 + * 5 -)=25
(3 2 -)=1
(6 4 3 2 + * / 5 -)=-5
スポンサーサイト

comment

post




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。