以相反的堆栈顺序显示字母

时间:2021-05-26 13:12:39

标签: java linked-list stack

我使用链表编写了这段堆栈代码,但我遇到了以相反顺序打印字母的代码的问题,而没有创建以相反顺序显示字母的函数

class SimpleLinkedListStack2 实现 SimpleStack ,Iterable {

static class ListNode<T> {
    public T value;
    public ListNode<T> next;


    public ListNode(T value, ListNode<T> next) {

        this.value = value;
        this.next = next;
    }
}

private ListNode<T> head = null;
private int count = 0;
public Iterator<T> iterator() {
    return new Iterator<T>() {
        private ListNode<T> next = head;
        @Override
        public boolean hasNext() {
            return next != null;
        }
        @Override
        public T next() {
            if (next == null)
                throw new NoSuchElementException();
            T value = next.value;
            next = next.next;
            return value;
        }
    };
    }




@Override
public void push(T value) {
    head = new ListNode<>(value, head);
    count++;
}

@Override
public T pop() throws Exception {
    if (count == 0) {
        throw new Exception("Stack is empty");
    }
    T value = head.value;
    head = head.next;
    count--;
    return value;
}

@Override
public T peek() throws Exception {
    if (count == 0) {
        throw new Exception("Stack is empty");
    }
    return head.value;
}


}

这是主类

public class main {

public static void main(String[] args) {

   SimpleLinkedListStack2 <String>stack2= new SimpleLinkedListStack2<>();
   stack2.push("a");
   stack2.push("b");
   stack2.push("c");
   stack2.push("d");
   stack2.push("e");
   for (String letters : stack2){
       System.out.println(letters);
   }



}
}

出不过是

e d C 乙 一种 因为我需要在类 SimpleLinkedListStack2 中做一个函数来显示字母的相反顺序

1 个答案:

答案 0 :(得分:0)

只需遍历您的代码:

<块引用>

stack2.push("a");

这会将您堆栈的 headnull 更改为没有 next 且值为 "a" 的节点。您的堆栈现在是:-> ["a", -> null],其中 -> 是“指向对象”。

<块引用>

stack2.push("b");

现在你的堆栈是 -> ["b", -> ["a", -> null]]:你为 "b" 创建一个新的 ListNode 对象,并将它的“next”指针更新为 head 是什么,然后 head 指向这个新创建的东西。

因此,当然,如果您随后对其进行迭代,您将首先获得最后添加的内容(此处为“b”)。

因此,您的代码 pritns e d c b a - 这是您以相反顺序放入列表的内容,因为这就是您编程的内容,这就是堆栈的内容(它们是“后进先出”-最后一个您输入的内容是 e,根据设计,这是第一个出现的内容!

但我想按照放入物品的顺序打印!

这是一个所谓的“单向链表”,意思是,任何给定的 LinkedNode 都知道它的下一个节点,但不知道它的前一个节点。 您不能就地反向遍历单向链表 - 如果没有激烈的步骤,您想要的东西是不可能的。

例如,您可以创建一个全新的堆栈,只需遍历此堆栈,自然会导致新创建的堆栈与原始堆栈完全相反。然后打印反向堆栈,然后将其扔掉(java 被垃圾收集;那部分会自动发生)。没有“简单”的解决方案/没有不占用内存的解决方案。您也可以直接构建字符串,然后将其反转。

也许这就是这个家庭作业练习的重点,让您思考这些 LinkedNode 对象在内存中是如何相互关联的。拿出一张纸,去勾勒出来。框和箭头。你会弄明白的。