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

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

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

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

Q&A

解決済

1回答

1230閲覧

Linked Listでpopとpeekのみを使用して中間データと末尾データを削除したい

pocopiiiiiii

総合スコア1

Java

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

0グッド

0クリップ

投稿2021/06/26 07:56

編集2021/06/26 22:35

java

1class MyLinkedStack { 2 class Node { 3 Node next = null; // 次のリストへのポインタ 4 String data; // 格納するデータ 5 public Node(String d) {data = d;} // コンストラクター 6 } 7 8 Node head = new Node(null); 9 10 public void push(String item) { 11 Node n = new Node(item); 12 n.next = head; 13 head = n; 14 } 15 16 public String pop() { 17 if (head.next == null) 18 throw new IllegalStateException("空の stack を pop した!"); String item = head.data; 19 head = head.next; 20 return item; 21 } 22 23 public String peek() { 24 if (head.next == null) 25 throw new IllegalStateException("空の stack を peek した!"); return head.data; 26 } 27 28 @Override 29 public String toString() { 30 String str = "["; 31 Node n = head; 32 while (n.next != null && n.next.next != null) { 33 str += n.data + ", "; 34 n = n.next; 35 } 36 if (n.next != null) str += n.data; 37 return str + "]"; 38 } 39} 40

java

1//MyLinkedStack継承 2class NewLinkedStack extends MyLinkedStack { 3 Node next = head; 4 MyLinkedStack mls= new MyLinkedStack(); 5 6 //public NewLinkedStack(Node head) { 7 // mls.head = head; 8 // TODO 自動生成されたコンストラクター・スタブ 9 ///} 10 11 public boolean remove(String d) { 12 String result = peek(); 13 //非存在のデータの確認はこれで良いのかなと思っています 14 if (!(result.equals(d))) { 15 return false; 16 }else { 17 //中間データの削除方法がわかりません 18 //末尾データの削除方法がわかりません 19 20 } 21 return true; 22 } 23} 24

java

1// 単元07課題1用事前提供ファイル 2// 指示に従って作成したプログラムのテストプログラムです 3// このプログラムを実行して所定の結果が得られることを確認してください 4// このプログラムは変更しないでください 5 6class StackTest { 7 public static void main(String[] args) { 8 NewLinkedStack nls = new NewLinkedStack(); 9 try { 10 System.out.println("push pop peekのテスト"); 11 nls.push("a"); 12 nls.push("b"); 13 nls.push("c"); 14 nls.push("d"); 15 nls.push("e"); 16 nls.push("f"); 17 System.out.println(nls); 18 System.out.println("pop →" + nls.pop()); 19 System.out.println("peek →" + nls.peek()); 20 21 System.out.println(nls.toString()); 22 if (!nls.toString().equals("[e, d, c, b, a]")) { 23 24 System.out.println("push pop peek テスト ■NG " + nls); 25 return; 26 } 27 System.out.println("push pop peek テスト OK " + nls); 28 29 System.out.println("\n項目数が3以上の時のテスト"); 30 if (nls.remove("x") || !nls.toString().equals("[e, d, c, b, a]")) { 31 System.out.println("非存在データ削除テスト ■NG " + nls); 32 return; 33 } 34 System.out.println("非存在データ削除 OK " + nls); 35 36 if (!nls.remove("c") || !nls.toString().equals("[e, d, b, a]")) { 37 System.out.println("中間データc削除できず ■NG " + nls); 38 return; 39 } 40 System.out.println("中間データc削除 OK " + nls); 41 42 if (!nls.remove("e") || !nls.toString().equals("[d, b, a]")) { 43 System.out.println("先頭データe削除できず ■NG " + nls); 44 return; 45 } 46 System.out.println("先頭データe削除 OK " + nls); 47 48 if (!nls.remove("a") || !nls.toString().equals("[d, b]")) { 49 System.out.println("末尾データa削除できず ■NG " + nls); 50 return; 51 } 52 System.out.println("末尾データa削除 OK " + nls); 53 54 System.out.println("\n項目数が2の時のテスト"); 55 if (nls.remove("x") || !nls.toString().equals("[d, b]")) { 56 System.out.println("非存在データ削除テスト ■NG " + nls); 57 return; 58 } 59 System.out.println("非存在データ削除 OK " + nls); 60 61 if (!nls.remove("b") || !nls.toString().equals("[d]")) { 62 System.out.println("末尾データb削除できず ■NG " + nls); 63 return; 64 } 65 System.out.println("末尾データb削除 OK " + nls); 66 67 nls.push("g"); 68 if (!nls.toString().equals("[g, d]")) { 69 System.out.println("pushできず ■NG " + nls); 70 return; 71 } 72 System.out.println("データgのpush OK " + nls); 73 74 if (!nls.remove("g") || !nls.toString().equals("[d]")) { 75 System.out.println("先頭データg削除できず ■NG " + nls); 76 return; 77 } 78 System.out.println("先頭データg削除 OK " + nls); 79 80 System.out.println("\n項目数が1の時のテスト"); 81 if (nls.remove("x") || !nls.toString().equals("[d]")) { 82 System.out.println("非存在データ削除テスト ■NG " + nls); 83 return; 84 } 85 System.out.println("非存在データ削除 OK " + nls); 86 87 if (!nls.remove("d") || !nls.toString().equals("[]")) { 88 System.out.println("唯一データd削除できず ■NG " + nls); 89 return; 90 } 91 System.out.println("唯一データd削除 OK " + nls); 92 93 System.out.println("\n項目数が0の時のテスト"); 94 if (nls.remove("x") || !nls.toString().equals("[]")) { 95 System.out.println("データ削除テスト ■NG " + nls); 96 return; 97 } 98 System.out.println("データ削除 OK " + nls); 99 100 } catch (IllegalStateException e) { 101 System.out.println(e); 102 } 103 } 104} 105/* 実行結果 106>java StackTest 107テストプログラム>java StackTest 108push pop peekのテスト 109[f, e, d, c, b, a] 110pop →f 111peek →e 112push pop peek テスト OK [e, d, c, b, a] 113 114項目数が3以上の時のテスト 115非存在データ削除 OK [e, d, c, b, a] 116中間データc削除 OK [e, d, b, a] 117先頭データe削除 OK [d, b, a] 118末尾データa削除 OK [d, b] 119 120項目数が2の時のテスト 121非存在データ削除 OK [d, b] 122末尾データb削除 OK [d] 123データgのpush OK [g, d] 124先頭データg削除 OK [d] 125 126項目数が1の時のテスト 127非存在データ削除 OK [d] 128唯一データd削除 OK [] 129 130項目数が0の時のテスト 131データ削除 OK [] 132*/ 133// Copyright 2017 FUJITSU APPLICATIONS LIMITED 134

【概要】
Linked Listのスタックを先頭から見ていき、指定データがあれば削除するというプログラムを作成したいです。
継承しているクラスのメソッドに
peek(),pop()しか存在せず、
新しいクラスでのメソッドも
boolean remove (String d)のみもつという制限がついています。
peekもpopもスタックの先頭に対しての
メソッドのため、どうやって中間データや最後のデータを確認、削除すれば良いかわかりません。
教えていただければ幸いです。

【条件】
NewLinkedStack クラスはMyLinkedStack クラスを継承
NewLinkedStack クラスは remove メソッドのみを持つ
スタックを先頭から見ていき指定データがあれば削除し true を返す。
指定データが複数あっても最初の 1 つしか削除しない。
指定データがなければ false を返す。

【ゴール】
tackTest.java を実行して全ての結果でOKが出ること。

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

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

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

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

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

shiketa

2021/06/26 12:26

> Linked Listのスタックを先頭から見ていき * ここでいう Lined List というのは、java.util.LinkedList https://docs.oracle.com/javase/jp/8/docs/api/java/util/LinkedList.html のことですか? それとも自作のものですか? * 件のスタックには、remove(), peek(), pop()メソッドしか存在しないのですか? * peek(), pop()メソッドの仕様は、java.util.Stack https://docs.oracle.com/javase/jp/8/docs/api/java/util/Stack.html ど同じですか?それとも別ですか? わからないことだらけです。
shiketa

2021/06/26 12:28

> 指定データがあれば削除するというプログラムを作成したいです メソッド名からしてremove()メソッドは上記の動作をするものなのではありませんか。そうであれば、削除したい指定データをremove()メソッドに指定して実行すれば済むのではないでしょうか。
pocopiiiiiii

2021/06/26 22:37

・自作の単方向リストです。 ・ peek(), pop()メソッドの仕様は同じです。
guest

回答1

0

ベストアンサー

継承しているクラスのメソッドにpeek(),pop()しか存在せず、

とのことでしたが、存在しないはずのpush()メソッドがあるので使わせてもらいました。pop()して、避けといて、該当するブツならそこでやめて、避けといたものを尻からpush()する。

java

1 public boolean remove(String d) { 2 final List<String> tmp = new ArrayList<>(); 3 Boolean result = null; 4 5 while (true) { 6 if (head.next == null) { 7 result = false; 8 break; 9 } 10 11 final String item = super.pop(); 12 if (d.equals(item)) { 13 result = true; 14 break; 15 } 16 17 tmp.add(item); 18 } 19 20 Collections.reverse(tmp); 21 tmp.stream().forEach(item -> super.push(item)); 22 23 return result; 24 } 25 }

投稿2021/06/27 04:39

shiketa

総合スコア3971

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

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

pocopiiiiiii

2021/06/27 05:50

少し勘違いしてました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問