我试图创建一个堆栈来接收一个字符串并将每个字符串字符添加到它,但我被告知它会更高效地使用LinkedList。我将如何使用LinkedList来创建和操作堆栈?如何从链表中创建堆栈?
一个例子将非常感激!
我试图创建一个堆栈来接收一个字符串并将每个字符串字符添加到它,但我被告知它会更高效地使用LinkedList。我将如何使用LinkedList来创建和操作堆栈?如何从链表中创建堆栈?
一个例子将非常感激!
好了,问题是,你不使用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
:)
Java的LinkedList是一个双向链表,它具有高效的访问器来获取,添加和移除列表的末尾和头部的元素,因此您可以使用这些方法来模拟堆栈。
你能提供一个例子吗?我不确定代码会是什么样子 – Jay
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(); }
}
不过,如果你的筹码只是针对字符串中的字符作为你的问题建议,你可能想直接动态字符数组上模拟堆栈。我将把这些作为练习留给读者,或者我可以在将来的编辑中提供。
下面是示例:Stack implementation。希望能帮助到你。
它是用C#做,但你的想法
这使我困惑了一下......但我很欣赏这个输入! – Jay
什么是混淆?这个想法是你总是首先添加T,然后总是从链表中删除第一个节点 – DarthVader
更高效?为什么? – Thilo
@Thilo因为当我做“Stack”时,我不断收到错误。 –
Jay
Re:不断收到错误?你怎么知道代码不工作时效率不高? – Thilo