0

皆さん、循環キュー配列を印刷しようとすると問題が発生します。私のコードは次のとおりです。

public class CircularQueue {

    private int [] queue;
    private int front, rear;

    // do not change the constructor
    CircularQueue() {
        queue = new int [5];
        front = 0;
        rear = -1;
    }

    // FILL IN:
    // throws DSException if out of space
    public void enqueue ( int item  ) throws DSException {
            if ( front == 0 && rear == -1 ){
                    throw new DSException();
            }
            queue[rear+1] = item;
            rear = (rear+1)%queue.length;
    }

    // FILL IN:
    // throws DSException if no element in the queue
    // return the dequeued value
    public int dequeue () throws DSException {
            if ( front == 0 && rear == -1 ){
                    throw new DSException();
            }

            int temp = queue[front];
            queue[front] = 0;
            front = (front+1)%queue.length;
            return temp;

    }


    // FILL IN:
    // return the value at beginning of the queue
    // throws DSException if no element in the queue
    public int first () throws DSException {
            return front;
    }

    // FILL IN:
    // print the circular queue in the following format
    // - print "+" before the value at the front
    // - print "-" after the value at the rear
    // - print "." for the places without valid element.

    public void print () {
        System.out.print("      <");
        for ( int i = 0; i < queue.length; i++ ){
                if ( front == 0 && rear == -1 ){
                        System.out.print("."+"\t");
                } else if ( i == front ) {
                        System.out.print("+"+ queue[i]);
                } else if ( i == rear ) {
                        System.out.print( queue[i]+ "-");
                } else if ( i == front && i == rear) {
                        System.out.print("+"+ queue[i] +"-");
                } else {
                        System.out.print( queue[i] );
                }
        }
        System.out.print(">\n");
    }    

}

結果は次のとおりです。. . . . > エンキュー (0):

私は0-4をエンキューし、いくつかの要素をデキューすることになっていますが、エンキュー0の後に停止します.

4

3 に答える 3

1

これが私のアプローチです。ただし、ここでは、配列内の空のブロックはゼロで初期化され、有効なエントリはゼロ以外であると想定しています。また、キューが部分的に満たされている場合はゼロを出力します。

public void print() {
            if (isEmpty()) {
                System.out.println("Queue is empty");
            } else {
                System.out.println("In order from latest to oldest");
                int i = front;
                while (i < array.length) {
                    System.out.print(array[i] + " ");
                    i++;
                }
                i = i % array.length;
                if(array[i] != 0) {
                    while(i < front) {
                        System.out.print(array[i] + " ");
                        i++;
                    }
                }
            }
        }
于 2016-06-05T12:55:38.803 に答える
1


CircularQueueは 3 つの状態になることができ、その不変 条件は以下のとおりです
:
上記の通り


public class CircularQueue {

private int [] queue;
private int front, rear;

// do not change the constructor
CircularQueue() {
    queue = new int [5];
    front = -1; 
    rear = -1;
}

// FILL IN:
// throws DSException if out of space
public void enqueue ( int item  ) throws DSException,Exception {
        if ( front == -1 && rear == -1 ){
               front = 0;
               rear = 0;
               queue[rear] = item;
        }  
        else if((rear+1)%queue.length == front) {
                 throw new Exception("Full");
        }
        else {
             rear = (rear+1)%queue.length;
             queue[rear] = item;
        }



}

// FILL IN:
// throws DSException if no element in the queue
// return the dequeued value
public int dequeue () throws DSException {

        if ( front == -1 && rear == -1 ){
                throw new DSException();
        }
        else {
            int ret = queue[front];
            if(rear==front) {
                   rear = -1;
                   front = -1;
            }
            else {
                front = (front+1)%queue.length;
            }
            return ret;
        }
}


// FILL IN:
// return the value at beginning of the queue
// throws DSException if no element in the queue
public int first () throws DSException {
        if(front==-1 && rear ==-1) {
               throw new DSException();
        }
        return queue[front];
}

// FILL IN:
// print the circular queue in the following format
// - print "+" before the value at the front
// - print "-" after the value at the rear
// - print "." for the places without valid element.

public void print () {
    if(front==-1 && rear == -1) {
          for(int i=0;i<queue.length;i++) {
               System.out.print(".");
          }
    }
    else {
        if(front<=rear) {
              for(int i=0;i<=front-1;i++) { 
                  System.out.print(".");   
              }
              System.out.print("+");
              for(int i=front;i<=rear;i++) { 
                  System.out.print(queue[i]);
              } 
              System.out.print("-");
              for(int i=rear+1;i<=queue.length-1;i++) { 
                  System.out.print(".");   
              }
        }
        else  {
              for(int i=0;i<=rear;i++) { 
                  System.out.print(queue[i]);   
              }
              System.out.print("-");
              for(int i=rear+1;i<=front-1;i++) { 
                  System.out.print(".");
              } 
              System.out.print("+");
              for(int i=front;i<=queue.length-1;i++) { 
                  System.out.print(queue[i]);   
              }
        }

    }

}    

}

于 2013-04-24T05:46:58.700 に答える
0

循環配列とフロント/リアインデックスの問題は、「full」と「empty」が区別できないことです。ブール値の「空」を追加する必要があります。これは最初はtrueであり、テストで使用されます。

private int [] queue;
private int front, rear;
private boolean empty;

// do not change the constructor
CircularQueue() {
    queue = new int [5];
    front = 0;
    rear = -1;
    empty = true;
}

// FILL IN:
// throws DSException if out of space
public void enqueue ( int item  ) throws DSException {
        if (!empty && (front - rear + queue.length) % queue.length == 1){
                throw new DSException();
        }
        queue[rear+1] = item;
        rear = (rear+1)%queue.length;
        empty = false;
}

// FILL IN:
// throws DSException if no element in the queue
// return the dequeued value
public int dequeue () throws DSException {
        if (empty){
                throw new DSException();
        }            

        int temp = queue[front];
        queue[front] = 0;
        front = (front+1)%queue.length;
        empty = (front - rear + queue.length) % queue.length == 1;
        return temp;

}
于 2013-03-14T14:05:59.093 に答える