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

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

ただいまの
回答率

90.50%

  • C#

    9006questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 818

kanade2016

score 50

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

class MainClass
    {   
        public static void Main (string[] args)
        {  
            Console.WriteLine ("Hello World!");
            List<int> a = new List<int> ();
            List<double> b = new List<double> ();
            a.Add (10);
            a.Add (20);
            a.Add (30);
            b.Add (40);
//            Stack stk = new Stack ();
//            stk.Push ();
//            stk.Pop ();
            for (int i = 0; i < a.Length; i++) {
                Console.WriteLine (a.Get(i));
            }
        }
    }



    class List<T>
    {  
        public T[] a;
        public int Length;

        public List()
        {
            Length = 0;
            a = new T[0];
        }


        public void Add(T v){
            T[] b = new T[a.Length+1];
            for (int i = 0; i < a.Length; i++) {
                b[i] = a[i];
            }
            b [a.Length] = v;
            a = b;
            Length = b.Length;
        }

        public T Get(int i){
            return a[i];
        }

        public void Delete(T v){
            T[] c = new T[a.Length-1];
            for (int i = 0; i < a.Length; i++) {
                c[i] = a[i];
            }
            c [a.Length] = v;
            a = c;
            Length = c.Length;
        }


    class Stack
    {   List<int> y = new List<int> ();
            T[] b = new T[y.Length+1];
            int head = y [0];
            int tail = y[y.Length+1];
        public Stack()
        {

        }

        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);
                }
        }

    }

    class Queue
    {
        public Queue()
        { 
        }
        public void Push(int i){
        List<int> z = new List<int> ();
            z.Add (i);
            z.Delete (i);
            }
        }

    }

}


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をつけたのですが
そうすると大量にエラーが出てしまいました。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

class Something {
  int a; // <- これがフィールドです。正確にはnonstaticフィールドともいいます。
  static b = 0; // <- これもフィールドといいます。正確にはstaticフィールドです。
  // nonstaticフィールドも宣言と同時に初期化できます。
  int c1 = 0; // 定数で初期化できます。
  int c2 = b; // staticフィールドでも初期化できます。
  int c3 = c1; // コンパイルエラー:nonstaticフィールドの値を使った初期化はできません。

  Something() {
    c3 = c1; // ここにかけばnonstaticフィールドの値でc3を初期化できる。
  }
}

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

一個目のエラーについて

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

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

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

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

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

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

List<int> y = new List<int> ();
T[] b = new T[y.Length+1]; //yを使ってるからエラー
int head = y [0];
int 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クラスを定義してることです。

class List
{
    class Stack
    { }

    class Queue
    { }
}

        

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

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

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

class List
{ }

class Stack
{ }

class Queue
{ }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    9006questions

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