電子書籍の厳選無料作品が豊富!

Pythonについてです。
中間記法を逆ポーランド記法へ変換するにはどうしたら良いですか?

質問者からの補足コメント

A 回答 (16件中11~16件)

あー、ひょっとしたらshellが上手く動いてないのかなぁ。



ええと、Windows?
Windowsだとしたら冒頭のシェバングがひょっとしたら

#! /usr/bin/env python

でいいかもしんない。

それはさておき。
WindowsだとしたらDOS窓かなんかで、そのスクリプトを置いた場所に移動(cdコマンド)して、そのスクリプト名を打って、Enterキー(ないしはリターンキー)を打って実行してください。
そうすると入力になるんで、そこではじめて数式を打ち込みます。

こっちはLinuxでやってるんで完全に同じじゃないんだけど、大体画面的には次の写真のようになりますね。
「Pythonについてです。 中間記法を逆」の回答画像6
    • good
    • 0
この回答へのお礼

Windowsでスパイダーを用いています

実行結果を補足説明で画像添付しました。
このように計算結果を表示するんですよね…

後半のスクリプトに移動して数式を打ち込む?というのはよくわからないです

お礼日時:2021/07/25 16:38

> やはり計算結果のみの表示で逆ポーランド記法での計算式は表示されないですね…



それはおかしいですね。
プログラム的には単純に言うと、ある文字列から別の文字列に変換してるだけなんで、「計算結果」なんて出ない筈ですが・・・・・・。
何で勝手に計算結果なんぞ出てるんだ(笑)?

下の写真のようにならない?
だとしたらオカルトですよ(笑)。
近くに心霊スポットとかないですか(笑)?
「Pythonについてです。 中間記法を逆」の回答画像5
    • good
    • 0

> 階乗計算を含めるとエラーが出てしまいます。



階乗計算をどうやったかは知りませんが、このプログラム上では**を使ってます。

3 ** 2
3 2 **
>>>
3 + 2 ** 4
3 2 4 ** +
>>>

> 計算結果だけでなく、中間記法で書いた計算式をを逆ポーランド記法での表示も可能でしょうか?

あれ?そのプログラムを書いた筈ですが・・・・・・。
    • good
    • 0
この回答へのお礼

すいません、階乗計算についてはこちらのミスで普通にできました

ですがやはり計算結果のみの表示で逆ポーランド記法での計算式は表示されないですね…

お礼日時:2021/07/25 16:11

あー、ちなみに。



コピペしたら多分ダメだと思いますよ。
教えて!gooではインデントが消去されてしまうので、わざと全角の空白をインデント代わりに使っています。
よって、コピペしたら多分、全角空白をパーズした時点でエラーとなるんじゃないかしらん。

メンド臭くても写経してください。
    • good
    • 0
この回答へのお礼

そうなんですね
足し算や掛け算などは行えたのですが、階乗計算を含めるとエラーが出てしまいます。

あと、計算結果だけでなく、中間記法で書いた計算式をを逆ポーランド記法での表示も可能でしょうか?

多くて申し訳ありませんが、ご教授のほどよろしくお願い致します。

お礼日時:2021/07/25 15:45

> スパイダーにて実行してみたのですがエラーが出てしまいました。



そのエラーを提示してください。
加えて、環境はWindowsでイイんでしょうか?
    • good
    • 0

#!/usr/bin/env python3



def infix2RPN(e):
 # 演算子は自由に追加して良い。
 # 数値が多い程優先順位が高い事にしている。
 operator_precedence = {"(" : 0, ")" : 0,
             "+" : 1, "-" : 1,
             "*" : 2, "/" : 2, "%": 2,
             "**" : 3}
 stack = []
 buffer = []
 for token in e:
  if token.isdigit():
   buffer += [token]
  elif token in operator_precedence.keys():
   if token == ')':
    while (ch := stack.pop(0)) != '(':
     buffer += [ch]
   elif token == '(':
    stack = [token] + stack
   else:
    while True:
     if stack == []:
      stack = [token] + stack
      break
     elif operator_precedence[token] > operator_precedence[stack[0]]:
      stack = [token] + stack
      break
     else:
      buffer += [stack.pop(0)]
  else:
   pass
 return buffer + stack

if __name__ == '__main__':
 print(" ".join(infix2RPN(input().split(" "))))
    • good
    • 1
この回答へのお礼

すいません、スパイダーにて実行してみたのですがエラーが出てしまいました。

お礼日時:2021/07/25 15:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!