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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

2672閲覧

スタック・キューアルゴリズムのエラー

kanade2016

総合スコア60

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/11/14 12:13

今、スタック・キューアルゴリズムを実装しています。
http://flute.u-shizuoka-ken.ac.jp/~s-okubo/class/language/t006.htm
スタックとキューが実現できるようにC#で実装しているのですが、

C#

1 class MainClass 2 { 3 public static void Main (string[] args) 4 { 5 Console.WriteLine ("Hello World!"); 6 List<int> a = new List<int> (); 7 List<double> b = new List<double> (); 8 a.Add (10); 9 a.Add (20); 10 a.Add (30); 11 b.Add (40); 12// Stack stk = new Stack (); 13// stk.Push (); 14// stk.Pop (); 15 for (int i = 0; i < a.Length; i++) { 16 Console.WriteLine (a.Get(i)); 17 } 18 } 19 } 20 21 22 23 class List<T> 24 { 25 public T[] a; 26 public int Length; 27 28 public List() 29 { 30 Length = 0; 31 a = new T[0]; 32 } 33 34 35 public void Add(T v){ 36 T[] b = new T[a.Length+1]; 37 for (int i = 0; i < a.Length; i++) { 38 b[i] = a[i]; 39 } 40 b [a.Length] = v; 41 a = b; 42 Length = b.Length; 43 } 44 45 public T Get(int i){ 46 return a[i]; 47 } 48 49 public void Delete(T v){ 50 T[] c = new T[a.Length-1]; 51 for (int i = 0; i < a.Length; i++) { 52 c[i] = a[i]; 53 } 54 c [a.Length] = v; 55 a = c; 56 Length = c.Length; 57 } 58 59 60 class Stack 61 { List<int> y = new List<int> (); 62 T[] b = new T[y.Length+1]; 63 int head = y [0]; 64 int tail = y[y.Length+1]; 65 public Stack() 66 { 67 68 } 69 70 public void Push(int i){ 71 for (int x = 0; x < a.Length; x++){ 72 b.Add(i); 73 } 74 } 75 public void Pop(int i){ 76 for (int x = 0; x < a.Length; x++){ 77 b.Delete (i); 78 } 79 } 80 81 } 82 83 class Queue 84 { 85 public Queue() 86 { 87 } 88 public void Push(int i){ 89 List<int> z = new List<int> (); 90 z.Add (i); 91 z.Delete (i); 92 } 93 } 94 95 } 96 97}

2箇所エラーが出てしまいました。

一つ目が、
A field initializer cannot reference the nonstatic field, method, or property
というものです。
調べてみると、
インスタンス フィールドを使用して、メソッドの外部にある他のインスタンス フィールドを初期化することはできません。
とありましてhttps://msdn.microsoft.com/ja-jp/library/5724t6za.aspx、
”フィールドの初期化”の意味がわからず困っています。

T[] b = new T[y.Length+1]; int head = y [0]; int tail = y[y.Length+1];

ここの3行でエラーが出ました。
2つ目は、
Cannot access a non-static member of outer type というエラーです。

public void Push(int i){ for (int x = 0; x < a.Length; x++){ b.Add(i); } } public void Pop(int i){ for (int x = 0; x < a.Length; x++){ b.Delete (i); } }

のところで出て、
AddとDeleteメソットのところに
public static void Add(T v) とstaticをつけたのですが
そうすると大量にエラーが出てしまいました。

どのように書けばスタック・キューアルゴリズムができるのでしょうか?

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

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

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

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

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

guest

回答3

0

List<T>やQueue<T>やStack<T>は既に System.Collections.Generic に用意されているのですが、勉強のための実装ということで良いですか?

#一個目のエラーについて

"フィールドの初期化"の意味がわからず困っています。

フィールドというのはメンバ変数のこと。

メンバ変数の初期化には二種類方法があります。
・宣言と同時に初期化する
・コンストラクタで初期する

このうち、宣言と同時に初期化する方法 の方では他のメンバ変数を使ってはいけないという縛りがあります。

「A field initializer cannot reference the nonstatic field, method, or property」というエラーは、宣言と同時に初期化する方法の中で他のメンバ変数を使ってるから出てるエラーです。

提示のコードで言うと、bとかtailの初期化にyが登場するのが良くないです。

C#

1List<int> y = new List<int> (); 2T[] b = new T[y.Length+1]; //yを使ってるからエラー 3int head = y [0]; 4int tail = y[y.Length+1]; //yを使ってるからエラー

単純には、これらのフィールドをコンストラクタで初期化するようにすれば回避できます。

#二個目のエラーについて

Cannot access a non-static member of outer type というエラー ~~

public static void Add(T v) とstaticをつけたのですが ~~

Add に static を付けるのは誤った対処なので一旦戻してください。
良くないのがListクラスの中でStackクラスを定義してることです。

C#

1class List 2{ 3 class Stack 4 { } 5 6 class Queue 7 { } 8}

上のような形になってますよね。
たぶん分からずに使っているのではないかと思うのですが、これは入れ子クラスというそこそこ高度なテクニックで、少なくとも今回のような簡単なプログラムでは無用の長物だと思われます。

ちなみにコンパイラの出したstatic云々と言うメッセージは、入れ子クラスを使用している文脈でのエラーメッセージなので、そもそも間違えて入れ子クラスを使っている人にとってはこのエラー文は的を射ていません。

まずは下のような構造に直して再度挑戦することをおすすめします。

C#

1class List 2{ } 3 4class Stack 5{ } 6 7class Queue 8{ }

投稿2016/11/14 14:32

MagoCat

総合スコア86

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

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

0

ベストアンサー

A field initializer cannot reference the nonstatic field, method, or property

c#

1class Something { 2 int a; // <- これがフィールドです。正確にはnonstaticフィールドともいいます。 3 static b = 0; // <- これもフィールドといいます。正確にはstaticフィールドです。 4 // nonstaticフィールドも宣言と同時に初期化できます。 5 int c1 = 0; // 定数で初期化できます。 6 int c2 = b; // staticフィールドでも初期化できます。 7 int c3 = c1; // コンパイルエラー:nonstaticフィールドの値を使った初期化はできません。 8 9 Something() { 10 c3 = c1; // ここにかけばnonstaticフィールドの値でc3を初期化できる。 11 } 12}

まずはこんなところでしょうか。nonstaticフィールドはnew Something()として新たなインスタンスを生成したときに初期化されますが、フィールドの宣言と同時に初期化したい場合はその初期値にはstaticフィールドもしくは定数しか使えません。nonstaticフィールドはコンストラクターの本体に入った以降でしか参照できないからです。

この意味を正しく把握するためにはまずクラスとインスタンスの違いと、フィールドやメソッドのnonstatic/staticがそれぞれどういう意味を持つか勉強してください。

これらの理解があいまいだとStack/Queueに限らずどのようなクラスであっても適切な定義はできません。

投稿2016/11/14 13:01

編集2016/11/14 13:05
KSwordOfHaste

総合スコア18392

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

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

0

こんにちは。

QueueもStackも標準クラスで既に用意されてますが、その前提で自分で実装しようとされているのでしょうか。


その前提のもと、自前で実装されたいということでしたら、まず、何をしたいのか整理されては如何でしょう。
現状は自前でList<T>を実装していたり、内部クラスでStackやQueueを定義していたりですし。
Main関数をみても何をしたいのかちょっとわからなかったもので。

投稿2016/11/14 13:52

Tak1wa

総合スコア4791

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問