具有基于数组的堆栈和 queue 检查的回文

Palindrome with Array based stack and queue check

对于作业,我们将应用标题中的内容。我已经把所有的代码都写出来了,但是当我编译代码时,我在处理代码的第 19 行时遇到了四个错误。

while(!myQueue<String>.isEmpty() & !myStack.isEmpty()){

如果对您有帮助的话,这是完整的代码

    import java.util.*;
    public class Palindrome{
         public static void main(String[] args){
         Scanner scan = new Scanner(System.in);
         String userInputConversion;
         String userInput;
         MyStack myStack = new MyStack();
         MyQueue<String> myQueue = new MyQueue<String>();
         System.out.println("Enter in a possible Palindrome. ");
         userInputConversion = scan.next();
         userInput = userInputConversion.toLowerCase();
         String s = new String();
    for(int i = 0; i < userInput.length(); i++){
        s = "" + userInput.charAt(i);
        System.out.print(s);
        myQueue.enqueue(s);
        myStack.push(s);
    }
    while(!myQueue<String>.isEmpty() & !myStack.isEmpty()){
        String deQueued = myQueue.dequeue();
        String popped = myStack.pop();
    if(deQueued == popped)
        System.out.println("Input is a palindrome. ");
    else
        System.out.println("input isnt a palindrome. ");
    }
        }
    }
    class MyStack{
    private String[] stack;
    private int top;
    public MyStack(){
    stack = new String [100];
    top = 0;
}
public String push(String pushP){
    if(top >= stack.length){
        System.out.println("Error: MyStack.push(): stack overflow");
        return "yes";
    }
    stack[top] = pushP;
    top++;
}
public String pop(){
    if(top <= 0){
        System.out.print("Error in MyStack.pop(): stack empty");
        return "n";
    }
    top--;
    return stack[top];
}
public boolean isEmpty(){
    if(top == 0){
        return true;
    }
    else{
        return false;
    }
    }
    `}
    class MyQueue<String> implements Iterable<String> {
    private String[] queue;
    private int front = 0;
    private int rear = 0;
    private int currentSize = 0;

public MyQueue(){
    queue = (String[])(new Object[1]);
    front = 0;
    rear = 0;
    currentSize = 0;
}
public boolean isEmpty() {
    return (currentSize == 0);
}
public int currentSize() {
    return currentSize;
}
public void enqueue(String String) {
    if (currentSize == queue.length - 1) {    
        resize(2 * queue.length);
    }

    queue[rear++] = String;

    if (rear == queue.length) {
        rear = 0;  
    }

    currentSize++;
}

public String dequeue() {
    if (this.isEmpty()) {
        throw new RuntimeException("Tried to dequeue an empty queue");
    }
    else {
        String itemToReturn = queue[front];
        queue[front++] = null; 
        currentSize--;
        if (front == queue.length) {
            front = 0;
        }
        if (currentSize == queue.length / 4) {
            resize(queue.length / 2);
        }

        return itemToReturn;
    }
}

private void resize(int capacity) {
    String[] newArray = (String[]) new Object[capacity];
    for (int i = 0; i < currentSize; i++) {
        newArray[i] = queue[(front + i) % queue.length];
    }
    queue = newArray;
    front = 0;
    rear = currentSize;
}
}

如果有人能提供帮助那就太好了或者给点指点。

首先你让事情变得复杂,对于一个简单的字符串,你为什么要使用 stack 或 queue 。我想下面的逻辑会对你有所帮助

String original, reverse = "";
      Scanner in = new Scanner(System.in);

      System.out.println("Enter a string to check if it is a palindrome");
      original = in.nextLine();

      int length = original.length();

      for ( int i = length - 1; i >= 0; i-- )
         reverse = reverse + original.charAt(i);

      if (original.equals(reverse))
         System.out.println("Entered string is a palindrome.");
      else
         System.out.println("Entered string is not a palindrome.");

对于你的第二个编译错误,The type MyQueue<String> must implement the inherited abstract method Iterable<String>.iterator(),你可以

  • 实施public Iterator<String> iterator()方法
  • 删除 implements Iterable<String> 语句
  • 或者创建 MyQueue abstract

创建 MyQueue abstract 对您没有多大帮助,而且我也没有在代码中看到您需要 iterator 或利用 MyQueueIterable。作为一个队列,你会想要使用它的签名方法——enqueue & dequeue。因此,您可以安全地选择选项 2。否则要实施,answer 应该会有所帮助。

你也没有很好地实现type arguments的概念。您可能希望在 class 定义中使用 Type Parameter;例如class MyQueue<String> 变为 class MyQueue<T>。同样,成员变量和方法也会发生变化。

你的第 3 个编译错误,This method must return a result of type String 只是因为你的 push() 方法最后没有 return 语句。最好将其设为 void,因为您不会在任何地方使用返回的 String "yes"。对于 Whosebug,您可以抛出一个 RuntimeException,就像您在 dequeue.

中所做的那样

几点建议

  • 您犯了 classic 错误,在 if (deQueued == popped).
  • 语句中将字符串与 == 而不是 .equals() 进行比较
  • 养成关闭 scanner/resources 的习惯,即使在这种情况下也没有坏处。

你的 while loop 在比较字符时有一点逻辑错误 - 我会让你找出那个。