我正在尝试创建一个Stack来获取一个字符串并将每个字符串字符添加到它中,但我被告知使用LinkedList会更有效率。我如何使用LinkedList创建和操作堆栈?
非常感谢一个例子!
答案 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#完成,但你明白了