はじめに
今回,この記事を書いた理由なのですが,大学のテストにて
「逆ポーランド記法で計算をするプログラムを作成しなさい」
という問題に対し.一つの部分でめちゃくちゃ手間取ったので,自分のメモ用にということで作成しています.
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])
1 2 * 3 +
1 2 3 4 - * 5 - +
テスト中,上手くメソッドを考えることが出来なかったので,調べることが出来ず.上のコメントの部分で手詰まりになっていました.
どこが出来なかったのか
逆ポーランド記法は,オペランドと数字が入ってきます.つまり,「文字なのか」「オペランドなのか」という判別が必要になります.
上の isnum
の関数の中で,入ってきた文字が int型の数字なのか,それとも文字型のオペランドなのかを判別する必要があります.
僕はここで,文字列が数字にキャストできるかどうか,という部分を実装できず,結局プログラムを組むことが出来ませんでした.
解決方法
isdigit()
を使えばすべてが解決してくれるっぽい.isdigit()を使うと,それがint型に変換できるかどうかを返してくれます.
word=["1","hato","1.0",""]
for w in word:
print(w + " -> ",end="")
print(w.isdigit())
出力
1 -> True
hato -> False
1.0 -> True
-> False
こんな感じで文字列を,整数型にキャストできるかどうかを判別してくれます.これを使用すればなんでもできます.
実際にこれを使用して上のコードを書き直すとこうなります.
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])
変更点
def isnum():
if int(hoge) == True:
return 1
else:
return 0
そもそもここの部分がいらない.isdigit() を使用すれば,この関数がいらなくなる.結局ワンライナーになれた.上のプログラムを実行すると,正しい答えを導くことが出来た.
5
-6