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

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

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

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

Q&A

解決済

1回答

2461閲覧

java.util.ArrayDequeでpopとpushを使ってスタックとして書くとどうなるのでしょうか

gyro16

総合スコア89

Java

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

0グッド

0クリップ

投稿2018/01/08 07:41

編集2018/01/09 04:34

###前提・実現したいこと

ハノイの塔を
スタックを使って書くにはどうすればいいか

Deque<Integer> xstack = new ArrayDeque<Integer>();
Deque<Integer> ystack = new ArrayDeque<Integer>();

円盤の数字を格納するスタックも必要ですね
Deque<Integer> stack = new ArrayDeque<Integer>();

3ステップ
●開始軸から中間軸へno-1枚移動する
●円盤noを開始軸から目的軸へ移動
●中間軸から目的軸へno-1枚移動する

no = 3のとき
move(3, 1, 3)
これが
●move(2, 1, 2):2枚の円盤を1軸から2軸へ移動する
(1, 1, 3)円盤1を1軸から3軸へ移動
(2, 1, 2)円盤2を1軸から2軸へ移動
(1, 3, 2)円盤1を3軸から2軸へ移動

●(3, 1, 3)円盤3を1軸から3軸へ移動

●move(2, 2, 3):2枚の円盤を2軸から3軸へ移動
(1, 2, 1)円盤1を2軸から1軸へ移動
(2, 2, 3)円盤2を2軸から3軸へ移動
(1, 1, 3)円盤1を1軸から3軸へ移動
これで完了

この順で
取り出し出されるスタックを書きたい

これをpushとpopを使って書きたい

java.util.ArrayDequeでpopとpushを使ってスタックとして書くとどうなるのでしょうか
Deque<Integer>

while(!stack.isEmpty())文を使いたいです。

Deque<Integer> stack = new ArrayDeque<Integer>();
Deque<Integer> xStack = new ArrayDeque<Integer>();
Deque<Integer> yStack = new ArrayDeque<Integer>();

move(3, 1, 3)

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

エラーメッセージ

###該当のソースコード

java

1 2import java.util.Scanner; 3import java.util.Deque; 4import java.util.ArrayDeque; 5class HanoiN { 6 static void move(int no, int x, int y) { 7 Deque<Integer> xStack = new ArrayDeque<Integer>(); 8 Deque<Integer> yStack = new ArrayDeque<Integer>(); 9 Deque<Integer> stack = new ArrayDeque<Integer>(); 10 11 stack.push(no); 12 xStack.push(x); 13 yStack.push(y); 14 while(!stack.isEmpty()){ 15 if(no > 1){ 16 stack.push(--no); 17 xStack.push(x); 18 yStack.push(6-x-y); 19 continue; 20 } 21 while(!stack.isEmpty()){ 22 no = stack.pop(); 23 x = xStack.pop(); 24 y = xStack.pop(); 25 System.out.println("円盤[" + no + "]を" + x + "軸から" + y + "軸へ移動"); 26 do{ 27 if(no > 1){ 28 stack.push(--no); 29 xStack.push(6-x-y); 30 yStack.push(y); 31 x = 6-x-y; 32 continue; 33 } 34 }while(stack.peek()!= 1); 35 } 36 } 37 } 38 } 39 40 public static void main(String[] args) { 41 Scanner stdIn = new Scanner(System.in); 42 43 System.out.println("ハノイの塔"); 44 System.out.print("円盤の枚数:"); 45 int n = stdIn.nextInt(); 46 47 move(n, 1, 3); 48 } 49} 50

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
Deque<Integer>
https://teratail.com/questions/107057

move(3, 1, 3);
開始
(3, 1, 3)プッシュ
(2, 1, 2)プッシュ
(1, 1, 3)プッシュ
スタック 入り口 (1, 1, 3)(2, 1, 2)(3, 1, 3) 底
(1, 1, 3)ポップ
(2, 1, 2)ポップ
(1, 3, 2)プッシュ
(1, 3, 2)ポップ
(3, 1, 3)ポップ
(2, 2, 3)プッシュ
(1, 2, 1)プッシュ
(1, 2, 1)ポップ
(2, 2, 3)ポップ
(1, 1, 3)プッシュ
(1, 1, 3)ポップ
終了
このロジックを実現させたいです

円盤1がプッシュされた(ピークが円盤1)ならポップにする

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

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

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

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

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

umyu

2018/01/08 07:49

ソースの構造をどこまで変更して良いのかの制約事項を明記すると返信が付きやすいと思いますー。
gyro16

2018/01/09 02:41 編集

---
gyro16

2018/01/09 02:41 編集

---
gyro16

2018/01/09 02:42 編集

---
gyro16

2018/01/09 02:42 編集

---
guest

回答1

0

自己解決

java

1 2import java.util.ArrayDeque; 3import java.util.Deque; 4import java.util.Scanner; 5class HanoiN { 6 static void move(int no, int x, int y){ 7 Deque<Integer> stack = new ArrayDeque<Integer>(); 8 Deque<Integer> xStack = new ArrayDeque<Integer>(); 9 Deque<Integer> yStack = new ArrayDeque<Integer>(); 10 stack.push(no); 11 xStack.push(x); 12 yStack.push(y); 13 while(!stack.isEmpty()){ 14 if(no > 1){ 15 stack.push(--no); 16 xStack.push(x); 17 yStack.push(6-x-y); 18 y = 6-x-y; 19 continue; 20 } 21 if(!stack.isEmpty()){ 22 no = stack.pop(); 23 x = xStack.pop(); 24 y = yStack.pop(); 25 System.out.printf("円盤%dを%d軸から%d軸へ移動\n", no, x, y); 26 if(no > 1){ 27 stack.push(--no); 28 xStack.push(6-x-y); 29 yStack.push(y); 30 x = 6-x-y; 31 continue; 32 } 33 } 34 } 35 } 36 public static void main(String[] args){ 37 Scanner stdIn = new Scanner(System.in); 38 System.out.println("ハノイの塔"); 39 System.out.print("円盤の枚数:"); 40 int n = stdIn.nextInt(); 41 move(n, 1, 3); 42 } 43} 44

投稿2018/01/09 06:31

編集2018/01/09 07:43
gyro16

総合スコア89

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問