java - 队列数组实现resize

标签 java arrays methods queue

我需要创建一个简单的队列数组实现,其中包含入队、出队、isEmpty 等基本方法。我唯一的问题是,当涉及到调整大小方法时,我陷入困境,因为如果我想向队列添加更多值(具有固定大小,因为是一个数组),我不知道如何使其工作并将所有值保留在地方。 一切都有效,以防万一您想知道,唯一的事情是我的调整大小不起作用(这里写的方法并不是我尝试的唯一方法)。 如果你想尝试一下,我也把我的主要方法也放出来,希望对你有帮助,谢谢。

主要方法:

  public class MainQueue {
              public static void main(String[] args) {

            int capacity=10;
            Queue<Integer> queue = new Queue<Integer>(capacity);

            queue.enqueue(1);
            queue.enqueue(2);
            queue.enqueue(3);
            queue.enqueue(4);
            queue.enqueue(5);
            queue.enqueue(6);
            queue.enqueue(7);
            queue.enqueue(8);
            queue.enqueue(9);
            queue.enqueue(10);

            System.out.println("Queue: "+ queue);

                            //WORKS SO FAR
                            queue.enqueue(11);
                            //11 is placed at the beginning of the queue  
                            //instead at the end and my last value is null (?)                              

类队列:

 import java.util.NoSuchElementException;


 public class Queue <E>{
 private E[] elements;//array in generic
 private int front;//first element or front of the queue
 private int back;//last element or back of the queue
 private int capacity; //capacity of the queue
 private int count; //indicates number of elements currently stored in the queue

        @SuppressWarnings("unchecked")
        public Queue(int size)
        {
            capacity = size;
            count = 0;
            back = size-1;
            front = 0;
            elements =(E []) new Object[size];  //array empty   
        }

    //Returns true if the queue is empty or false
    public boolean isEmpty()
        {
            return count==0;//means its true
        }

    //Add elements to the queue 
    public void enqueue(E item)
        {  
            if(count == capacity) 
            {  
                 resize(capacity*2);
                  // System.out.println("Queue is full");  

             }

            back =(back+1) % capacity;    //example back=(0+1)%10=1
            elements[back]=item;
            //elements[0]=0
            //item=elements[count];
            count++;
            }


    //Public resize
    public void resize(int reSize){
        E[] tmp = (E[]) new Object[reSize];

           int current = front;
           for (int i = 0; i < count; i++)
              {
              tmp[i] = elements[current];
              current = (current + 1) % count;
              }
         elements = tmp;

           }


    //Dequeue method to remove head
    public E dequeue() 
            {
                if(isEmpty())
                    throw new NoSuchElementException("Dequeue: Queue is empty");
                else
                {
                    count--;
                    for(int x = 1; x <= count; x++)
                    {
                        elements[x-1] = elements[x];
                    }
                    capacity--;
                    return (E) elements;
                }
            }

//peek the first element
    public E peek()   
        {
            if(isEmpty())  
               {  
                   throw new NoSuchElementException("Peek: Queue is empty");
               }

               else  
                   return elements[front];
         }


//Print queue as string
     public String toString()    
           {  

           if(isEmpty()) {
               System.out.println("Queue is empty.");
            //throw new NoSuchElementException("Queue is empty");
           }

               String s = "[";  
               for(int i = 0; i <count; i++)  
               {  
                   if(i != 0)  
                       s += ", ";  
                   s = s + elements[i];// [value1,value2,....]  
               }  

               s +="]";  
              return s;  
           }  

       public void delete() {   //Delete everything
           count = 0;
       }
       }

最佳答案

调整大小时您忘记更新内容: 正面、容量和背面。

public void resize(int reSize){
    E[] tmp = (E[]) new Object[reSize];

       int current = front;
       for (int i = 0; i < count; i++)
          {
          tmp[i] = elements[current];
          current = (current + 1) % count;
          }
     elements = tmp;
     front = 0;
     back = count-1;
     capacity=reSize;
       }

关于java - 队列数组实现resize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20137487/

相关文章:

java - 通过套接字传输空字符时出现问题

java - 如何使 JButton 在同一目录中运行可执行文件?

c - 打印数据并给出开始和结束

java - 非静态方法引用?

java - 如何获取未命名模块的 Java 9 ModuleReference

java - 为什么 IntelliJ IDEA 看不到 HttpClients?

JavaScript 按嵌套对象降序对数组进行排序

sql - 数组 (UUID[ ]) 是否打破 1NF?

python - 如何调用存储在变量中的方法?

function - 为什么我不能用两个 i32 参数调用 gen_range?