@ゲー単走部

ローグライク雑記。変愚蛮怒、DCSSなど。

逆ポーランド記法

逆ポーランド記法ってなんやねんって感じだったが(括弧なしではどうやって読めばいいのかわからず困惑していた)、
要するに数を順番にスタックに積んでいって、演算子がスタックに入ったら後に入れたほうから計算していくっていうだけのことなんやな。
難しそうに見えて全然難しくなかった。

逆ポーランド以外の記法はどういうデータ構造で実装すればいいんだろうか。スタックときたら次はキューか?

def calculate(arg):
    args_list = arg.split(' ') # space区切りの文字列として受け取る
    stack = []

    if len(args_list) == 1:
        return float(arg)
    if len(args_list) == 2:
        return '入力が足りない'

    calc_dict = {
            '+': (lambda x, y: x + y),
            '-': (lambda x, y: x - y),
            '*': (lambda x, y: x * y),
            '/': (lambda x, y: x / y)
    }

    for str in args_list:
        if str in ['+', '-', '*', '/']:
            stack[-2] = calc_dict[str](stack[-2], stack[-1])
            del stack[-1]
        else:
            stack.append(float(str))

    return stack[0] if len(stack) == 1 else '計算途中'

ちなみにこのプログラムは正常な逆ポーランド記法に対しては正常に動作するはずだが、異常入力に対してどうなるかはまともに調べてないので知らない。
おかしな入力でエラーが出て落ちるのは別にいいのだが、おかしな入力からなぜか数字が出てきたりしたらまずい。
あるいは計算途中判定される?

入力の文字列の並びを見て、自動で逆ポーランド記法かそれ以外の記法か判定して、それに基づいて計算するプログラムとかできれば面白そうなんだが、さてさて。