我尝试打印链表实现的堆栈元素。
但要按堆栈本身的顺序打印,我需要一个java中的静态变量。
public void display()
{
<STATIC> <here I need> LinkedListImp temp = this;
while(temp.next!=null)
{
temp=temp.next;
display();
}
System.out.println("nt"+ temp.element +"n");;
}
但是,在这样声明的同时,我得到了一个错误。
我已经在接口概念中实现了display()。因此,我无法显示(LinkedListImp temp)。
interface StackMethods
{
int pop();
void push(int numberint);
void display();
}
例如,如果堆栈的元素为1,则为2,然后为3。我不希望输出为1 2 3或1(换行)2(换行)3。
相反,我想要作为3(换行符)2(换行符)1(尽管不需要演示真实堆栈)
有没有其他方法可以实现这一点?
如果希望temp
的值不依赖于display()
的父类(LinkedListImp
?)的实例,则需要一个静态类变量。在Java中,static
关键字标记属于整个类而不是单个实例的变量。Java中的静态创建了一个也称为"类变量"的变量。根据定义,类变量不能是本地的。要了解更多关于静态变量的信息,请查看文档中的说明,或者查看这个StackOverflow问题,该问题的答案中包含规范。
但看起来您要做的是使用类的实例,这意味着您不需要静态变量。您绝对希望将值绑定到类。
不过,为了使它发挥作用,您需要在while循环中的两个语句周围使用大括号。否则,您将得到一个程序,该程序循环遍历链表的所有元素,并只打印出最后一个元素。这是因为在Java中,如果块语句(if
、else
、for
、while
等)后面没有大括号,则只将下一行视为块的内容。
public void display()
{
LinkedListImp temp = this;
while(temp.next!=null)
{
System.out.println("nt"+ temp.element +"n");
temp=temp.next;
}
}
为了用循环颠倒顺序,我会使用StringBuilder并构建一个字符串。
public void display()
{
LinkedListImp temp = this;
StringBuilder result = new StringBuilder();
while(temp.next!=null)
{
result.insert(0, "nt"+ temp.element +"n"); // put the result at the front
temp=temp.next;
}
System.out.println(result.toString());
}
根据您的编辑,您已经向该方法添加了一个递归调用,但对于循环来说这不是必需的。如果您正在执行递归,请删除循环。在这种情况下,递归将作为循环。在这种情况下,只需在调用display后打印出项目,下一个项目用于反向订单,或者之前打印出标准订单。
public display() {
doDisplay(this);
}
private void doDisplay(LinkedListImpl item) {
if(item.next) // implicit != null
{
doDisplay(item.next);
}
System.out.println("nt" + temp.element + "n"); // this line goes before
// the if statement for
// regular ordering
}
Java没有像C那样在函数中声明变量为静态的能力。我不明白你为什么认为你需要一个静态变量。。。
static
变量的声明与带有static关键字的普通实例变量一样。在方法中声明它们是违法的。此外,为什么不直接使用this
而不是将其分配给变量呢?
为了以相反的顺序打印列表,您可以使用一个辅助方法:
public void display() {
displayHelper(this);
}
private void displayHelper(LinkedListImp temp) {
if (temp.next != null)
displayInternal(temp.next);
System.out.println("nt"+ temp.element +"n");;
}
递归运行良好。我们甚至不需要helper方法。
public void display()
{
// Displays in reverse order. For forwards order, do it the other way around.
if (next != null) { next.display(); }
System.out.println("nt"+ element +"n");
}