1

我正在尝试在 Java 中创建自己的 Stack 类。我不确定我的代码哪里出错了,但是如果我在我的程序控制台中输入一个实际的回文,它总是返回 false。我的问题出在哪里?

这是我的回文客户端文件:(我的 stack.java 类可以在同一个程序文件夹中访问。)

public static void main(String args[]) {

//declare both stacks
Stack<String> fwd = new Stack<String>();
Stack<String> rev = new Stack<String>();

//instance variables
String st1;
boolean palindrome = true;

Scanner in = new Scanner(System.in);

System.out.println("Enter a String and I will check if it is a palindrome: \n");

st1 = in.nextLine();

// Read the data in forward order into the Stack
for (int i =0; i < st1.length(); i++) {
  fwd.push(Character.toString(st1.charAt(i)));
}
// Read the same data in reverse order into another Stack
for (int j = st1.length()-1; j >= 0; j--) {
  rev.push(Character.toString(st1.charAt(j)));
}
System.out.println("The string you entered was: ");
System.out.println(fwd.display());
System.out.println(rev.display());
System.out.println();
System.out.println("Checking to see if " + st1 + " is a palindrome.");
System.out.println("/**********************************************");

//check fwd and rev against each other
while (!fwd.isEmpty() && !rev.isEmpty()) {  // make sure stack in not empty
  for (int i = 0; i < st1.length(); i++) {  // go through each element in the stack

     if (fwd.pop() == rev.pop()) //check if fwd pop and rev pop are the same
        palindrome = true;
     else
        palindrome = false;

  }//end for lop
}// end while loop

System.out.println(palindrome);


}// end main

}// end Palindrome

这是我的 Stack.java 文件:

public class Stack<E> implements StackInterface<E> {

   //variables
   private ArrayList<E> data;
   private E element;


   //constructor
   public Stack() {

      data = new ArrayList<E>();
   }


   //stack methods
   public void push(E element) { //push new element into the stack

      data.add(element);
   }

   public E pop() { //pop the element from the top

      if (data.isEmpty()) //if stack is empty, throw exception
         throw new EmptyStackException("The stack is empty.");
      else //else, remove and return the element that is on top of the stack
         return data.remove(data.size()-1); 
   }

   public E peek() { //peek at the element on top of the stack without removing it

      if (data.isEmpty()) //if stack is empty, throw exception
         throw new EmptyStackException("The stack is empty.");
      else //else, return the element that is on top of the class
         return data.get(data.size()-1);   
   }

   public String display() { //display the elements in the stack in the form of a String

      if (data.isEmpty()) //if stack is empty, throw exception
         throw new EmptyStackException("The stack is empty");
      else //else, return elements as a String
         return data.toString();
   }

   public boolean isEmpty() { //check to see if the stack is empty

      if (data.size() == 0)
         return true;
      else
         return false;

   }

   public int size() { //retrurn the number of elements in the stack

      return data.size();

   }

}// end Stack class
4

1 回答 1

5

if (fwd.pop() == rev.pop()) 应该是if (fwd.pop().equals(rev.pop()))因为您正在比较两个字符串的内容。

break如果您检测到它不是回文,您还应该使用 while 循环,否则 "test" 将返回true

if (fwd.pop().equals(rev.pop())) //check if fwd pop and rev pop are the same
                palindrome = true;
             else {
                palindrome = false;
                break;
                 }
}

编辑 :

正如评论中所说,while 内的 for 循环实际上是无用的。

另一种选择是创建两个堆栈,Characters现在您可以使用==它们来比较它们:

Stack<Character> fwd = new Stack<>();
Stack<Character> rev = new Stack<>();

/**/
for (int i =0; i < st1.length(); i++) {
    fwd.push(st1.charAt(i));
}
for (int j = st1.length()-1; j >= 0; j--) {
    rev.push(st1.charAt(j));
}
while (!fwd.isEmpty() && !rev.isEmpty()) {  // make sure stack in not empty
        if (fwd.pop()==rev.pop()) //check if fwd pop and rev pop are the same
           palindrome = true;
        else {
           palindrome = false;
           break; //here break the while loop it's not a palindrom
        }
}// end while loop
于 2013-10-22T08:10:34.207 回答