-1

文字列を取得して各文字列文字を追加するスタックを作成しようとしていますが、LinkedListを使用する方がはるかに効率的であると言われました。LinkedListを使用してスタックを作成および操作するにはどうすればよいですか?

例をいただければ幸いです。

4

5 に答える 5

1

問題は、まったく使用Firstしていないことです。次のことを試してください。

public class Example
{
    private LinkedList aList = new LinkedList();

    public void push(char c) {
        aList.addFirst(c);
    }
    public Object pop() {
        return aList.removeFirst();
    }
    public boolean empty() {
        return aList.isEmpty();
    }
    public static void main(String[] args)  {
        Stack exmpStack = new Stack();
        String ranString = "Dad";
        for (int i = 0; i < ranString.length(); i++)  {
            exmpStack.push(ranString.charAt(i));
        }
        while (!exmpStack.empty())  {
            System.out.print(exmpStack.pop());
        }
    }
}

First常に使用することはないnullため、ループはまったく実行されません。それをまったく使用する代わりに、ビルドインisEmpty()機能を使用してください。

編集:もちろん、これらの関数はまったく必要ありません-次のようにするとうまくいきます:

public class Example
{
    private LinkedList aList = new LinkedList();

    public static void main(String[] args)  {
        String ranString = "Dad";
        for (int i = 0; i < ranString.length(); i++)  {
            aList.push(ranString.charAt(i));
        }
        while (!aList.isEmpty())  {
            System.out.print(aList.pop());
        }
    }
}

これはまだ少し安全ではありません。次の方法を使用して、さらに一歩進めることができます。

private LinkedList<Character> aList = new LinkedList<>();

そうすれば、少し安全になり、 -Characterの代わりに sを返し、暗黙的に:)にキャストできます。ObjectsCharacterschar

于 2013-01-21T02:22:49.220 に答える
0

JavaのLinkedListは二重にリンクされたリストであり、リストの最後と先頭の両方で要素を取得、追加、および削除するための効率的なアクセサーを備えているため、これらのメソッドを使用してスタックをエミュレートできます。

于 2013-01-21T02:07:28.673 に答える
0

LinkedListは、スタックよりも多くの操作を提供します。

文字列の文字をプッシュおよびポップするためにスタックを使用します。ただし、文字列を挿入する方法とは逆の順序でのみ文字を取得できます。したがって、この動作が必要かどうかはわかりますか。

リンクリストを使用すると、ヘッド/テールからデータを追加/取得できます。

于 2013-01-21T02:13:06.440 に答える
0

サンプルは次のとおりです。スタックの実装。それが役に立てば幸い。

それはC#で行われますが、あなたはアイデアを得る

于 2013-01-21T02:15:13.493 に答える
0

LinkedListStackに依存しているため同期メソッドが付属しているため、実際にはより効率的Vectorです。シングル スレッド アプリケーションでは、後者を使用することは、何のメリットもなく同期の代償を払うことを意味します。マルチスレッド アプリケーションであっても、同期をより細かく制御したい場合があります。

これは可能なLinkedListベースのソリューションです。継承の代わりに構成を使用することに注意してください。これにより、List 関連のメソッドを使用して悪用されることのない、適切に動作する Stack が得られます。

class MyStack<T> {
    private List<T> list = new LinkedList<T>();

    public void push(T object) { list.add(0, object); }

    public T pop(T object) {
        if (isEmpty()) throw new NoSuchElementException();
        return list.remove(0);
    }

    public boolean isEmpty() { return list.isEmpty(); }
}

それにもかかわらず、質問が示唆するようにスタックが文字列文字のみを対象としている場合は、動的文字配列でスタックを直接エミュレートすることをお勧めします。これは読者の演習として残しておくか、将来の編集で提供する可能性があります。

于 2013-01-21T02:12:07.430 に答える