🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

989閲覧

後置記法(逆ポーランド記法)の計算について

Jimmy_M06

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

3クリップ

投稿2019/09/25 04:40

前提・実現したいこと

初めて質問します。最近pythonを学び始めた者です、プログラミングは初体験となります、皆様よろしくお願いいたします。

Python 3.7系で作成しております。

<後置記法(逆ポーランド記法)の計算を作る>

1 2 + 3 4 + 5 6 * + のような計算式を
_stack = []

def push(x):
_stack.append(x)

def pop():
return _stack.pop()

def clear_stack():
_stack.clear()

def stack_depth():
return len(_stack)

def calc(xs):
print(xs,_stack) #Debug
if not xs == int():
return pop()
x.append(i)

return [0] operate(xs[0]) return calc(xs[1:])

def operate(x):
print(x)

以上を使ってあらわしたい。

**[1,2,+,3,4,+,5,6,,+]
[2,+,3,4,+,5,6,
,+][1]
[+,3,4,+,5,6,,+][1,2]
[3,4,+,5,6,
,+][3]
...のような結果が表示されて解にいたる物を作りたい。
**

発生している問題・エラーメッセージ

とくになし

該当のソースコード

Python

試したこと

上記定義を書いた

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/09/25 04:50

初体験でこれは早すぎます。ハローワールドから始めてください。
Jimmy_M06

2019/09/25 04:59

ご回答ありがとうございます。 誤解を招く表現がありすみません。プログラミングが初めてとは言いましたが始めてから1ヵ月が経っております。まだまだ努力が足りない段階ではありますが、挫折しかかっております。何か手がかりがございましたらご教示いただけると幸いです。
Zuishin

2019/09/25 05:01

そりゃ挫折するでしょう。このプログラムを作るには様々な前提知識が必要ですが、コードを見る限りあなたにそれはありません。 だから早いということです。
Jimmy_M06

2019/09/25 05:06

ありがとうございます。建設的な意見がいただけるかと思いきや...ビックリしました(笑)。@Zuishin 様は、何のためにteratailを利用されているのか理解に苦しみます。大先輩に失礼ではございますが、今後私のこの件に関して回答は結構ですよ。本当にありがとうございます。
Zuishin

2019/09/25 05:09

早過ぎることを知ることで、前提知識を得ることから始めることができ、効率が良くなります。 あなたが宿題を片付けるために teratail を利用していることは理解に苦しみます。ガイドライン違反です。 今後質問は結構です。
hayataka2049

2019/09/25 05:13

質問を編集し、コードをコードブロック内(<code>ボタンで挿入できます)に入れるようにしてください。そのまま貼り付けるとインデントが消えたりして不都合があります。 このコードまで自力で書けたが、他の部分が書けなくて詰まっているということでしょうか? それとも何かの課題などで、このコードは与えられているのでこれを使って他の部分を書けば良い、ということでしょうか。それによって回答の仕方が変わるので、質問に至った背景を書いておいてください。 「上記定義を書いた」以外に(コーディングに関して)試したことがあればそれも記載しておいてください。
Zuishin

2019/09/25 05:47

stack_depth とか operate とか何もわからない状態から思いつけるとは思えないので課題と見て間違いないと思います。
Y.H.

2019/09/25 06:05

「発生している問題・エラーメッセージ」が「とくになし」 何を質問されたいのでしょうか? 質問するときのヒント https://teratail.com/help/question-tips を読まれて質問を編集し、何が問題となっており、何を解決されたいのかを具体的に記載されると回答がつきやすいと思います。
meg_

2019/09/25 11:11

インプットとアウトプットの具体例を提示した方が分かりやすいかと思います。 インプットは文字列?リスト??
退会済みユーザー

退会済みユーザー

2019/09/25 11:18

質問がないので回答は不可能です。
guest

回答1

0

自己解決

Python

1 2import math 3_stack = [] 4 5def push(x): 6 _stack.append(x) 7 8def pop(): 9 return _stack.pop() 10 11def clear_stack(): 12 _stack.clear() 13 14def stack_depth(): 15 return len(_stack) 16 17def calc(xs): 18 print(xs,_stack) 19 if not xs: 20 return pop() 21 22 operate(xs[0]) 23 return calc(xs[1:]) 24 25def operate(x): 26 if isinstance(x, int): 27 push(x) 28 elif x == '+': 29 push( pop() + pop() ) 30 elif x == '-': 31 tmp = pop() 32 push( pop() - tmp ) 33 elif x == '*': 34 push( pop() * pop() ) 35 elif x == '/': 36 tmp = pop() 37 push( pop() / tmp ) 38 elif x == '//': 39 tmp = pop() 40 push( pop() // tmp ) 41 elif x == '**': 42 tmp = pop() 43 push( pop() ** tmp ) 44 elif x == 'root': 45 push( math.sqrt(pop()) ) 46 else: 47 raise ValueError(f'unknown operator: {x}') 48 49def execute(s): 50 def convert(elem): 51 if elem.isdigit(): 52 return int(elem) 53 else: 54 return elem 55 56 parsed = s.split(' ') 57 elems = [convert(elem) for elem in parsed if elem!=''] 58 print('calc. result >', calc(elems)) 59 60 61while True: 62 s = input('Enter the RPN.(Separated by spaces)> ') 63 if s.lower() in {'exit','quit','bye'}: 64 break 65 clear_stack() 66 try: 67 execute(s) 68 if stack_depth() > 0: 69 print('The value remains on the stack.') 70 except: 71 print('Invalid expression.') 72

9/27

ここまで何とかこぎつけましたが、もっとスマートにしたい。
省略できる部分や、早く動作するコツがあれば教えて頂きたいです。

投稿2019/09/27 04:45

Jimmy_M06

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Q71

2019/09/27 13:49

「スマート」を定義して下さい。英語の smart は「頭のよい、利口な、賢明な」という意味です。ここで「スマートにしたい」のは、何を、どういう風にでしょうか。
Jimmy_M06

2019/10/01 00:21

Q71様 smartの意味を教えてくださってありがとうございます。def operate(x):から以下にあるif elifをコンパクトにしたかったのですが、dictを使って書けました。今後ともどうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問