LoginSignup
2
1

More than 5 years have passed since last update.

Pythonで逆ポーランド記法のプログラムを作りたかった(文字列を数値に変えられるかの判定)

Posted at

はじめに

今回,この記事を書いた理由なのですが,大学のテストにて

「逆ポーランド記法で計算をするプログラムを作成しなさい」

という問題に対し.一つの部分でめちゃくちゃ手間取ったので,自分のメモ用にということで作成しています.

RPN.py
def isnum():
  if int(hoge) == True:
    return 1

  else:
    return 0

def cal(operand,a,b):
  if operand == "+":
    return int(a)+int(b)

  elif operand == "-":
    return int(a)-int(b)

  elif operand == "*":
    return int(a)*int(b)

por=[]
por = list(input().split())

stk=[]

for i in por:
  if isnum(i) == int:
  #ここで手間取っていた
    stk.append(int(i))

  else:
    b=stk.pop()
    a=stk.pop()
    stk.append(cal(i,a,b))

print(stk[0])
入力例.txt
1 2 * 3 +

1 2 3 4 - * 5 - +

テスト中,上手くメソッドを考えることが出来なかったので,調べることが出来ず.上のコメントの部分で手詰まりになっていました.

どこが出来なかったのか

逆ポーランド記法は,オペランドと数字が入ってきます.つまり,「文字なのか」「オペランドなのか」という判別が必要になります.
上の isnum の関数の中で,入ってきた文字が int型の数字なのか,それとも文字型のオペランドなのかを判別する必要があります.

僕はここで,文字列が数字にキャストできるかどうか,という部分を実装できず,結局プログラムを組むことが出来ませんでした.

解決方法

isdigit()を使えばすべてが解決してくれるっぽい.isdigit()を使うと,それがint型に変換できるかどうかを返してくれます.

isdigittest.py
word=["1","hato","1.0",""]

for w in word:
    print(w + " -> ",end="")
    print(w.isdigit())

出力
out.txt
1 -> True
hato -> False
1.0 -> True
-> False

こんな感じで文字列を,整数型にキャストできるかどうかを判別してくれます.これを使用すればなんでもできます.

実際にこれを使用して上のコードを書き直すとこうなります.

RPN2.py
def cal(operand,a,b):
  if operand == "+":
    return int(a)+int(b)

  elif operand == "-":
    return int(a)-int(b)

  elif operand == "*":
    return int(a)*int(b)

por=[]

por = list(input().split())

stk=[]

for i in por:
  if i.isdigit() == True:
    stk.append(int(i))

  else:
    b=stk.pop()
    a=stk.pop()
    stk.append(cal(i,a,b))

print(stk[0])

変更点

isnum.py
def isnum():
  if int(hoge) == True:
    return 1

  else:
    return 0

そもそもここの部分がいらない.isdigit() を使用すれば,この関数がいらなくなる.結局ワンライナーになれた.上のプログラムを実行すると,正しい答えを導くことが出来た.

こたえ.txt
5

-6
2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1