質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

4461閲覧

逆ポーランド記法への変換

chest

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2019/05/09 15:38

編集2019/05/10 01:30

### 逆ポーランド記法への変換

中置記法から逆ポーランド記法へ変換するコードを作成しています.
正直プログラミング初心者で,どこが間違っているのか検討もついていません.
投げやりな質問で申し訳ありませんが,力をお貸しいただきたいです…!

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

1 + 2 Exception in thread "main" java.lang.NullPointerException at Calculator2.compute(Calculator2.java:108) at Calculator2.main(Calculator2.java:155)

該当のソースコード

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.io.PushbackReader; 5import java.io.StringReader; 6import java.util.Arrays; 7import java.util.EmptyStackException;; 8 9class MyStack { 10 private char stack[]; 11 private int stackSize; 12 private int sp; 13 14 private static final int DEFAULT_STACK_SIZE = 100; 15 16 public MyStack() { 17 this(DEFAULT_STACK_SIZE); 18 } 19 20 public MyStack(int size) { 21 stack = new char[size]; 22 stackSize = size; 23 sp = 0; 24 } 25 26 public void clear() { 27 Arrays.fill(stack, '\u0000'); 28 sp = 0; 29 } 30 31 public void push(char x) { 32 if (sp >= stackSize) { 33 throw new IllegalStateException("Stack overflow"); 34 } 35 stack[sp++] = x; 36 } 37 38 public char pop() { 39 if (sp <= 0) { 40 throw new EmptyStackException(); 41 } 42 char value = stack[--sp]; 43 stack[sp] = '\u0000'; 44 return value; 45 } 46 47 public char check() { 48 if (sp <= 0) { 49 throw new EmptyStackException(); 50 } 51 char value = stack[sp - 1]; 52 return value; 53 } 54 55 public boolean isEmpty() { 56 return sp == 0; 57 } 58 59 public String toString() { 60 String s = "MyStack=["; 61 for (int i = 0; i < sp; i++) { 62 s = s + stack[i]; 63 if (i < sp - 1) 64 s = s + ","; 65 } 66 s = s + "]"; 67 return s; 68 } 69} 70 71public class Calculator2 { 72 private static MyStack stackA; 73 private static MyStack stackB; 74 75 public Calculator2() { 76 stackA = new MyStack(); 77 stackB = new MyStack(); 78 } 79 80 public static int rank(char x) { 81 if (x == '*' || x == '/' || x == '%') { 82 return 2; 83 } else if (x == '+' || x == '-') { 84 return 1; 85 } else { 86 return 0; 87 } 88 } 89 90 public static void allot(char num, char ch) { 91 if (num != '\u0000') { 92 stackA.push(num); 93 num = '\u0000'; 94 } else if (stackB.isEmpty() != true) { 95 if (rank(ch) >= rank(stackB.check())) { 96 if (ch == ')') { 97 stackB.pop(); 98 } else { 99 stackB.push(ch); 100 } 101 } else { 102 stackA.push(ch); 103 } 104 } 105 } 106 107 public static void compute(String exp) throws IOException { 108 stackA.clear(); 109 stackB.clear(); 110 111 PushbackReader input = new PushbackReader(new StringReader(exp + ";")); 112 113 int c; 114 char num = '\u0000'; 115 while ((c = input.read()) != ';') { 116 char ch = (char) c; 117 118 if (Character.isDigit(ch)) { 119 num = ch; 120 } else if (ch == '(') { 121 stackB.push(ch); 122 } else if (ch == ')') { 123 allot(num, ch); 124 } else if (ch == '-') { 125 allot(num, ch); 126 } else if (ch == '+') { 127 allot(num, ch); 128 } else if (ch == '*') { 129 allot(num, ch); 130 } else if (ch == '/') { 131 allot(num, ch); 132 } else if (ch == '%') { 133 allot(num, ch); 134 } else if (ch == ' ') { 135 136 } else if (ch == '\t') { 137 138 } else if (ch == '\r') { 139 140 } else { 141 throw new IllegalArgumentException("不正な文字" + ch + "がありました。"); 142 } 143 } 144 while (stackA.check() != '\u0000') { 145 stackB.push(stackA.pop()); 146 } 147 } 148 149 public static void main(String args[]) throws IOException { 150 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 151 152 String line; 153 while ((line = input.readLine()) != null) { 154 try { 155 compute(line); 156 System.out.println(stackB.toString()); 157 } catch (EmptyStackException e) { 158 System.out.println("式が正しくありません。"); 159 } 160 } 161 } 162} 163

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

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

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

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

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

dodox86

2019/05/09 16:35

質問内容とコメントから察するに、もとのコードは質問者さんとは別の方が書いたものでしょうか。そうであるか否かで、回答の仕方も変わってくる気がします。
m.ts10806

2019/05/09 21:15

タイトルに長々と「プログラミング初心者」と書いては要件ではないもので文字数とりすぎになるので、「初心者アイコン」をつけるだけにしておいてください
guest

回答3

0

どこが間違えてるって節穴ですか?
この実行時エラー(ヌル参照例外:NullPointerException)が出てるということは
NULLで初期化したオブジェクトにアクセスをしているのでそこらへんをまず直しましょう。

ファイル名と行番号が出てますよね。

at Calculator2.compute(Calculator2.java:108)

投稿2019/05/09 15:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chest

2019/05/09 16:11

無知なまま質問してしまい,申し訳ありません… もう少しがんばってみます
guest

0

ベストアンサー

修正を試みましたが絶望的なのであきらめました。

  • Calcutator2のインスタンス生成について理解できていない。
  • stackBに演算子が一つもプッシュされない。
  • allotがオペランドと演算子(')'も)をセットで扱うので終端記号';'の直前のオペランドが棄てられる。
  • MyStackのcheck()はisEmpty()のとき呼べないのにwhileで使っている。
  • ')'の処理がまったく考えられていない。

ダイクストラ先生のおっしゃるとおり演算子スタック1つでプログラムしてください。操車場アルゴリズム

投稿2019/05/09 19:09

xebme

総合スコア1081

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

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

xebme

2019/05/09 22:58

Calculator1が操車場アルゴリズムで、Calculator2が2スタックの課題なのかもしれませんね。様々なものが見えるのですが機能的に繋がっていません。私はこの課題、スクラッチから考える方が楽です。
guest

0

compute は static メソッドですが, 内部で使っている stackA/B は Calculator2 のコンストラクタで生成されています.
構造が変と思います.
compute メソッドも stackA/B も static にはせず, Calculator2 を生成して使うのが良いかと思います.

投稿2019/05/09 15:46

jimbe

総合スコア12632

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

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

chest

2019/05/09 16:12

「Calculator2 を生成して使う」の部分を詳しく教えていただきたいです!
jimbe

2019/05/09 16:39 編集

「Calculator2(のインスタンス)を生成して(そのメソッドを)使う」ということのつもりです. 幾つか修正して "1+2" を指定したら, "[1]" と出ました. どうやら他にも問題(バグ)のあるコードのようなので, お覚悟されたほうが良いかもしれません.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問