我一直在通过使用链表实现Stack。实现如下:
public class Node {
public Object e;
Node next;
public Node(Object e){
this.e=e;
}
}
public class Stack {
Nodo last, first;
int count;
public void push(Object n){
Nodo temp=new Nodo(n);
temp.next=last;
last=temp;
if (first==null){
first=temp;
}
count++;
}
public boolean isEmpty(){
if (count==0) return true;
else return false;
}
public Object pop(){
Object obj=null;
if (isEmpty()){
return -1;
}
else{
obj=last.e;
last=last.next;
}
count--;
return obj;
}
public void print(){
Nodo current=last;
while (current!=null){
System.out.println(current.e);
current=current.next;
}
}
public boolean palindrome(){
Stack cadT1=new Stack();
Stack cadT2=new Stack();
cadT1=this;
//System.out.println(this.isEmpty());
while (this.isEmpty()!=true){
cadT2.push(this.pop());
}
cadT1.print();
while (cadT1.isEmpty()!=true){
/*if (!(cadT1.pop().equals(cadT2.pop()))){
return false;
}*/
System.out.println(cadT1.pop()+" "+cadT2.pop());
}
return true;
}
我对回文功能的实现有疑问,在其中我也使用了堆栈。我的问题是它总是返回true的值。我已注释了当前无法正常工作的代码部分。在分析我的代码时,我发现当我执行以下任务时:
cadT1=this;
cadT1变量仍然为空。我已经通过在回文功能的同时放置以下行来测试这一点:
System.out.println(cadT1.pop()+" "+cadT2.pop());
我已经看到我的代码没有执行该行,这是因为while循环中的条件:
while (cadT1.isEmpty()!=true){
始终设置为false。 我的主类中正在运行的代码如下:
Stack word=new Stack();
word.push('a');
word.push('s');
word.push('d');
word.push('f');
System.out.println(word.palindrome());
我在做什么错?谢谢
答案 0 :(得分:1)
这是因为您已经用此弹出了当前堆栈中的所有元素
cadT2.push(this.pop());
现在,当您调用cadT1.print()
时,它将不会打印任何内容(cadT1
是对当前堆栈的引用)。因此,cadT1.isEmpty()
是正确的。
您可以做的是迭代链接列表并构建第二个堆栈,而不是从当前堆栈中弹出元素以构建第二个堆栈(如果弹出,则当前堆栈中没有任何要比较的元素反对)。