Я реализую стек, используя связанный список. Реализация следующая:
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());
Что я делаю неправильно? Спасибо
Это потому, что вы уже извлекли все элементы из текущего стека с помощью этого
cadT2.push(this.pop());
Теперь, когда вы вызываете cadT1.print()
, он ничего не печатает (cadT1
— это ссылка на текущий стек). Следовательно, cadT1.isEmpty()
будет правдой.
Что вы можете сделать, так это повторить связанный список и построить второй стек, а не извлекать элементы из текущего стека для построения второго стека (если вы выталкиваете, у вас не будет никаких элементов в текущем стеке для сравнения).
рассмотрите возможность реализации метода
peek()
и используйте его в журналах