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

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

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

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

Q&A

解決済

1回答

1018閲覧

String 型の要素を格納する Stack クラスを作りたい

8Hachikou8

総合スコア3

Java

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

0グッド

1クリップ

投稿2021/10/07 09:22

編集2021/10/08 00:37

以下のコードを参考に実装するの下の部分を作成しているのですが、途中でエラーが出てしまうのと、nullがpushされてしまいます。

表示したい実行結果
push:
aMyStack()
aMyStack(abc, def)
aMyStack(abc, def, ghi)
ghi
pop: ghi
aMyStack(abc, def)
pop: def
aMyStack(abc)
pop: abc
aMyStack()
エラーテスト
aMyStack()
pop エラー
top エラー
aMyStack()
aMyStack(1, 2, 3, 4)
aMyStack(1, 2, 3, 4, 5)
push エラー
aMyStack(1, 2, 3, 4, 5)

現状の実行結果
push:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 5
aMyStack()
aMyStack(null, abc)
aMyStack(null, abc, def)
ghi
pop: def
aMyStack(null, abc)
pop: abc
aMyStack(null)
pop: null
aMyStack()
at ex5.MyStack.pop(MyStack.java:37)
at ex5.MyStack.main(MyStack.java:99)

元のコード``````Java
javaのコード

public

1 private String[] items; // 要素を入れる配列 2 private int size; // スタックの最大サイズ 3 private int sp; // 空き場所を指すインデックス 4 5 public MyStack(int size) { 6 // TODO: メンバの初期化 7 } 8 9 /** 10 * 要素を追加する 11 */ 12 public void push(String str) { 13 // TODO: 実装する 14 } 15 16 /** 17 * トップ(最後に入れられた)要素を取り出して返す 18 * 19 * @return 要素。空なら null 20 */ 21 public String pop() { 22 // TODO: 実装する 23 // System.out.println("pop エラー"); // 空ならエラーを表示する 24 return null; 25 } 26 27 /** 28 * トップ(最後に入れられた)要素を取り出さずに参照する 29 * 30 * @return トップ要素。空なら null 31 */ 32 public String top() { 33 // TODO: 実装する 34 // System.out.println("top エラー"); // 空ならエラーを表示する 35 return null; 36 } 37 38 /** 39 * @return 空であるかどうか 40 **/ 41 public boolean isEmpty() { 42 // TODO: 実装する 43 return true; 44 } 45 46 public String toString() { 47 String[] actives = new String[sp]; 48 for (int i = 0; i < sp; i++) { 49 actives[i] = items[i]; 50 } 51 return "aMyStack(" + String.join(", ", actives) + ")"; 52 } 53 54 public static void main(String[] args) { 55 MyStack stack = new MyStack(5); 56 System.out.println("push:"); 57 System.out.println(stack); 58 stack.push("abc"); 59 stack.push("def"); 60 System.out.println(stack); 61 stack.push("ghi"); 62 System.out.println(stack); 63 System.out.println(stack.top()); 64 while (!stack.isEmpty()) { 65 System.out.println("pop: " + stack.pop()); 66 System.out.println(stack); 67 } 68 System.out.println("エラーテスト"); 69 System.out.println(stack); 70 stack.pop(); // 空のはずなのにpop! 71 stack.top(); // 空のはずなのにtop! 72 System.out.println(stack); 73 stack.push("1"); 74 stack.push("2"); 75 stack.push("3"); 76 stack.push("4"); 77 System.out.println(stack); 78 stack.push("5"); 79 System.out.println(stack); 80 stack.push("6"); // 一杯なはずなのにpush! 81 System.out.println(stack); 82 } 83} 84 85```java 86コード 87package ex5; 88 89public class MyStack { 90 // 要素を入れる配列 91 private String[] items; 92 // スタックの最大サイズ 93 private int size; 94 // 空き場所を指すインデックス 95 private int sp; 96 97 public MyStack(int size) { 98 // TODO: メンバの初期化 99 this.size=size; 100 this.items = new String[5]; 101 } 102 103 /** 104 * 要素を追加する 105 */ 106 public void push(String str) { 107 // TODO: 実装する 108 if (!isFull()) { 109 110 items[++sp] = str; 111 } 112 } 113 114 /** 115 * トップ(最後に入れられた)要素を取り出して返す 116 * 117 * @return 要素。空なら null 118 *java.lang.ArrayIndexOutOfBoundsException:配列の外の値を指定している 119 */ 120 public String pop() { 121 // TODO: 実装する 122 if (!isEmpty()) { 123 return items[--sp];//sp--は指定した後-1を引く 124 } else { 125 System.out.println("pop エラー"); 126 return null; 127 } 128 } 129 130 /** 131 * トップ(最後に入れられた)要素を取り出さずに参照する 132 * 133 * @return トップ要素。空なら null 134 */ 135 public String top() { 136 // TODO: 実装する 137 if (!isEmpty()) { 138 return items[sp]; 139 } else { 140 System.out.println("top エラー"); // 空ならエラーを表示する 141 return null; 142 } 143 } 144 145 /** 146 * @return 空であるかどうか 147 **/ 148 public boolean isEmpty() { 149 // TODO: 実装する 150 if (sp<0) { 151 return true; 152 } else { 153 return false; 154 } 155 } 156 157 //満タンかどうか 158 public boolean isFull() { 159 if (sp>=size) { 160 return true; 161 } else { 162 return false; 163 } 164 } 165 166 public String toString() { 167 String[] actives = new String[sp]; 168 for (int i = 0; i < sp; i++) { 169 actives[i] = items[i]; 170 } 171 return "aMyStack(" + String.join(", ", actives) + ")"; 172 } 173 174 public static void main(String[] args) { 175 MyStack stack = new MyStack(5); 176 System.out.println("push:"); 177 System.out.println(stack); 178 stack.push("abc"); 179 stack.push("def"); 180 System.out.println(stack); 181 stack.push("ghi"); 182 System.out.println(stack); 183 System.out.println(stack.top()); 184 while (!stack.isEmpty()) { 185 System.out.println("pop: " + stack.pop()); 186 System.out.println(stack); 187 } 188 System.out.println("エラーテスト"); 189 System.out.println(stack); 190 stack.pop(); // 空のはずなのにpop! 191 stack.top(); // 空のはずなのにtop! 192 System.out.println(stack); 193 stack.push("1"); 194 stack.push("2"); 195 stack.push("3"); 196 stack.push("4"); 197 System.out.println(stack); 198 stack.push("5"); 199 System.out.println(stack); 200 stack.push("6"); // 一杯なはずなのにpush! 201 System.out.println(stack); 202 } 203}

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

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

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

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

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

y_waiwai

2021/10/07 09:26

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
dodox86

2021/10/07 10:03 編集

マークダウン記法でのソースコードの記載は、 ```Java // Javaのコード ``` のように記述します。
YT0014

2021/10/07 12:44

現状の実行結果をご提示ください。
guest

回答1

0

ベストアンサー

sp の値を確認しましょう。

diff

1- items[++sp] = str; 2+ items[sp++] = str; 3 } 4+ else System.out.println("push エラー"); 5 6- return items[sp]; 7+ return items[sp-1]; 8 9- if (sp<0) { 10+ if (sp<=0) {
コードが2つあるのなら、別々に挟んでください。

投稿2021/10/07 14:56

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問