如何从链表中制作堆栈?

时间:2013-01-21 02:03:36

标签: java

我正在尝试创建一个Stack来获取一个字符串并将每个字符串字符添加到它中,但我被告知使用LinkedList会更有效率。我如何使用LinkedList创建和操作堆栈?

非常感谢一个例子!

5 个答案:

答案 0 :(得分: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而不是Objects - 而Characters可以隐式转换为char:)

答案 1 :(得分:0)

Java的LinkedList是一个双向链表,有效的访问器可以在列表的末尾和头部获取,添加和删除元素,因此您可以使用这些方法来模拟堆栈。

答案 2 :(得分:0)

LinkedList确实更有效率,因为Stack因其依赖Vector而带有同步方法。在单线程应用程序中,使用后者意味着支付同步价格没有任何好处。即使在多线程应用程序中,您也可能希望更好地控制同步。

这是一个可能的基于LinkedList的解决方案。请注意使用组合而不是继承。这将为您提供一个表现良好的Stack,它不能通过使用与List相关的方法来滥用。

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

尽管如此,如果你的问题建议你的堆栈仅用于字符串字符,你可能想直接在动态字符数组上模拟堆栈。我将把它作为练习留给读者,或者我可以在将来的编辑中提供它。

答案 3 :(得分:0)

LinkedList提供的堆栈操作更多。

您使用堆栈来推送和弹出字符串的字符。但是,您只能按照与插入字符串相反的顺序检索字符。所以你确定你是否想要这种行为。

链表允许您从头/尾添加/检索数据。

答案 4 :(得分:0)

以下是示例:Stack implementation。希望它有所帮助。

用C#完成,但你明白了