1

条件が次のような制限付きキュー クラスを作成するように依頼されました。

プリミティブ型のみを使用して、境界付きキューを実装して整数を格納します。データ構造は、アルゴリズムの実行時間、メモリ使用量、およびメモリ スループットに対して最適化する必要があります。外部ライブラリをインポートしたり使用したりしないでください。ソリューションは、次の機能を提供する 1 つのクラスで提供する必要があります。

  • コンストラクター - クラスは、整数を使用してキューのサイズを設定するオブジェクト作成用のメソッドを 1 つ提供する必要があります。
  • enqueue - キューがいっぱいでない場合、関数は整数を取り、それをキューに格納する必要があります。この関数は、キューがすでにいっぱいになっている場合を適切に処理する必要があります。
  • dequeue - 現在キューに格納されている場合、関数は整数を返す必要があります。関数は、キューが空の場合を適切に処理する必要があります。

私はこのクラスを書きましたが、誰かにテストしてもらい、正しく動作するかどうかを確認してもらいたいと思いました。私はそれをテストするために小さなメイン クラスを作成しました。インターンシップ用です。前もって感謝します。

public class Queue<INT>
{


    int size;
    int spacesLeft;
    int place= 0;
    int[] Q;


    public Queue(int size)
    {
        this.size = size;
        spacesLeft = size;
        Q = new int[size];
    }

    //enqueue - function should take an integer and store it in the queue if the queue isn't full.
    //The function should properly handle the case where the queue is already full
    public void enque(int newNumber) throws Exception
    {
        if(place <= size)
        {
            Q[place] = newNumber;
            place++;
            spacesLeft--;

        }
        else
            throw new Exception();
    }


    //dequeue - function should return an integer if one is currently stored in the queue. 
    //The function should properly handle the case where the queue is empty.
    public int deque() throws Exception
    {
        int dequeNum;


        if(spacesLeft == size)
            throw new Exception();
        else
        {
            dequeNum = Q[0];
            spacesLeft++;
        }

        int[] tempAry = new int[size];  
        for (int i=0; i < Q.length; i++)
        {  
            if(i < size-1)
            {
                tempAry[i] = Q[i+1]; // put in destination  
            }

        }

        Q = tempAry;

        for(int i = 0; i < Q.length; i++)
        {
            System.out.println("value in Q"+Q[i]);

        }


        return dequeNum;


    }
}
4

5 に答える 5

7

これは、仕様どおりの実装です。

列

これは同じソースコードです。

import java.util.Arrays;

public class Queue {

    private int enqueueIndex;// Separate index to ensure enqueue happens at the end
    private int dequeueIndex;// Separate index to ensure dequeue happens at the
                            // start
    private int[] items;
    private int count;
    // Lazy to add javadocs please provide
    public Queue(int size) {
        enqueueIndex = 0;
        dequeueIndex = 0;
        items = new int[size];
    }
    // Lazy to add javadocs please provide
    public void enqueue(int newNumber) {
        if (count == items.length)
            throw new IllegalStateException();
        items[enqueueIndex] = newNumber;
        enqueueIndex = ++enqueueIndex == items.length ? 0 : enqueueIndex;
        ++count;
    }
    // Lazy to add javadocs please provide
    public int dequeue() {
        if (count == 0)
            throw new IllegalStateException();
        int item = items[dequeueIndex];
        items[dequeueIndex] = 0;
        dequeueIndex = ++dequeueIndex == items.length ? 0 : dequeueIndex;
        --count;
        return item;
    }

    @Override
    public String toString() {
        return Arrays.toString(items);
    }
}
于 2012-10-03T08:33:52.197 に答える
2

エンキュー関数で

 if(place <= size)
    {
        Q[place] = newNumber;
        place++;
        spacesLeft--;

    }

place == size の場合はどうなりますか --> 範囲外のインデックス例外が発生します。

そしてデキュー関数では、常に Q[0] を返し、そのたびに新しいメモリを割り当て、古い配列を新しい配列に移動します!!!! これは非常に遅くなります。

于 2012-10-03T08:13:47.173 に答える
1

これをチェックしてください。配列をプレースホルダーとして使用します。

http://c-madeeasy.blogspot.com/2011/08/queue-using-array-in-java-complete.html

あなたもこれをチェックしてください。これは、リンクされたリストをプレースホルダーとして使用します。

http://algs4.cs.princeton.edu/13stacks/Queue.java.html

于 2012-10-03T08:21:03.723 に答える
0
package com.test;
public class QueueUsingArray {

    int sizeofArr; 
    int[] Q;
    int frontindex = -1;
    int rearindex = -1;
    int cnt=0;


    public QueueUsingArray(int sizeOfArr) {
        // TODO Auto-generated constructor stub
        this.sizeofArr = sizeOfArr;
        this.Q = new int[sizeOfArr];
    }

    public boolean isFull()
    {
      if (cnt == sizeofArr)
          return true;
          else
              return false;

    }
    public void enQueue(int Number) throws Exception
    {
        if(!isFull() ) /*Q is not Full and rearindx is not on last element of Array*/
        {  
            if(cnt == 0)
            {
                frontindex++;  
            }

            if (rearindex+1 != sizeofArr)
            {
                 Q[++rearindex] = Number;
            }
            else 
            {    rearindex= -1;
                 Q[++rearindex] = Number;   
            }
            cnt++;


        }

        else 
            throw new Exception("Queue Overflow");

    }

    public int deQueue() throws Exception
    {
        int x;
        if(cnt != 0)
        {
           cnt--;
           if (frontindex !=sizeofArr)
           {
                x = Q[frontindex];
                Q[frontindex] = -1;
                frontindex++;
                return x;
           }    
           else
           {   frontindex = 0;
                x = Q[0];
                Q[0] = -1;     
                return x;

           }   
        }  
        else
         throw new Exception("Queue Underflow");

    }
    public int size()
    {
        return cnt;

    }
      /*printQ method is not optimized to print Q from front to rear, and it just for verification     
       purpose */
    public void printQ()
    {
        System.out.println("current Q:");
        for(int i=0;i<Q.length;i++)
        {
            System.out.println(Q[i]);
        }

    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
      try{
        QueueUsingArray q = new QueueUsingArray(5);

        //System.out.println("Is QueuFull ?" + q.isFull());
        System.out.println("CurrentQueue Size is:" + q.size());
        //System.out.println(q.deQueue()); 

        q.enQueue(1);
        q.enQueue(2);
        q.enQueue(3);
        q.enQueue(4);
        q.enQueue(5);
        q.printQ();
        System.out.println("CurrentQueue Size is:" + q.size());
        System.out.println("Is QueuFull ?" + q.isFull());

        System.out.println(q.deQueue());
        System.out.println(q.deQueue());
        System.out.println(q.deQueue());
        System.out.println("CurrentQueue Size is:" + q.size());

        q.enQueue(6);
        q.enQueue(7);
        q.enQueue(8);
        q.printQ();
        System.out.println(q.deQueue());
        q.enQueue(9);
        q.printQ();
        System.out.println("CurrentQueue Size is:" + q.size());

         }catch(Exception e)
           {
              e.printStackTrace();  
           }
  }

}
于 2013-04-27T14:17:34.393 に答える
0

LinkedList を使用して Queue を実装しようとしました...それが助けになる場合は、効率的にするために気軽に resue/modify してください。

package com.test;


public class QueueUsingLinkeList {

public class Node{
    Object data; 
    Node next;

    public Node(Object data)
    {
        this.data = data;
        this.next = null;
    }


}

int cnt=0;
Node front=null;
Node rear=null;

public void enQueue(int number)
{
    Node n = new Node(number);

   if(front== null && rear==null)
       front = rear = n ; 
   else
   {
       rear.next = n;
       rear = rear.next;
   }
   cnt++;

}

public Object deQueue() throws Exception
{
    Node temp;
    if(front == null && rear == null)
    {   throw new Exception("Queue underflow, can not DeQueue any element");

    }
    else if (front== rear && front.next == null)
    {
         temp = front;
         front = rear = null;
         return temp.data;
    }
    else
    {
        temp = front;
        front = front.next;
        cnt--;
        return temp.data;
    }
}
public int size()
{
    return cnt;
}

public QueueUsingLinkeList() {



}

public void printQ()
{
    Node traverse = front;
    System.out.print("Current Queue::");
    for(int i=0;i<cnt;i++)
    {
        System.out.print(traverse.data.toString()+ "  ");
        traverse = traverse.next;
    } 

}
/**
 * @param args
 */
public static void main(String[] args) {
    try{
        QueueUsingLinkeList q = new QueueUsingLinkeList();

        //System.out.println("Is QueuFull ?" + q.isFull());
        System.out.println("CurrentQueue Size is:" + q.size());
        //System.out.println(q.deQueue()); 

        q.enQueue(1);
        q.enQueue(2);
        q.enQueue(3);
        q.enQueue(4);
        q.enQueue(5);
        q.printQ();
        System.out.println("CurrentQueue Size is:" + q.size());


        System.out.println(q.deQueue());
        System.out.println(q.deQueue());
        System.out.println(q.deQueue());
        q.printQ();
        System.out.println("CurrentQueue Size is:" + q.size());

        q.enQueue(6);
        q.enQueue(7);
        q.enQueue(8);
        q.printQ();
        System.out.println("CurrentQueue Size is:" + q.size());

        System.out.println(q.deQueue());
        System.out.println(q.deQueue());
                    q.enQueue(9);
        q.printQ();
        System.out.println("CurrentQueue Size is:" + q.size());
}catch(Exception e)
{
   e.printStackTrace(); 
}

}

}
于 2013-04-27T18:42:26.307 に答える