How do I implement a circular list (ring buffer) in C?

后端 未结 8 1663
心在旅途
心在旅途 2020-12-02 08:40

How do I implement a circular list that overwrites the oldest entry when it\'s full?

For a little background, I want to use a circular list within GWT; so using a 3

8条回答
  •  情歌与酒
    2020-12-02 09:14

    Here is an elegant way to create dynamically increasing/decreasing circular queue using java.

    I have commented most part of the code for easy & fast understanding. Hope it helps :)

        public class CircularQueueDemo {
        public static void main(String[] args) throws Exception {
    
            CircularQueue queue = new CircularQueue(2);
            /* dynamically increasing/decreasing circular queue */
            System.out.println("--dynamic circular queue--");
            queue.enQueue(1);
            queue.display();
            queue.enQueue(2);
            queue.display();
            queue.enQueue(3);
            queue.display();
            queue.enQueue(4);
            queue.display();
            queue.deQueue();
            queue.deQueue();
            queue.enQueue(5);
            queue.deQueue();    
            queue.display();
    
        }
    }
    
    class CircularQueue {
        private int[] queue;
        public int front;
        public int rear;
        private int capacity;
    
        public CircularQueue(int cap) {
            front = -1;
            rear = -1;
            capacity = cap;
            queue = new int[capacity];
        }
    
        public boolean isEmpty() {
            return (rear == -1);
        }
    
        public boolean isFull() {
            if ((front == 0 && rear == capacity - 1) || (front == rear + 1))
                return true;
            else
                return false;
        }
    
        public void enQueue(int data) { 
            if (isFull()) {            //if queue is full then expand it dynamically   
                reSize();                    
                enQueue(data);
            } else {                                 //else add the data to the queue
                if (rear == -1)                      //if queue is empty
                    rear = front = 0;
                else if (rear == capacity)          //else if rear reached the end of array then place rear to start (circular array)
                    rear = 0;
                else
                    rear++;                         //else just incement the rear 
                queue[rear] = data;                 //add the data to rear position
            }
        }
    
        public void reSize() {
            int new_capacity = 2 * capacity;                  //create new array of double the prev size
            int[] new_array = new int[new_capacity];          
    
            int prev_size = getSize();                        //get prev no of elements present
            int i = 0;                                        //place index to starting of new array
    
            while (prev_size >= 0) {                          //while elements are present in prev queue
                if (i == 0) {                                 //if i==0 place the first element to the array
                    new_array[i] = queue[front++];
                } else if (front == capacity) {               //else if front reached the end of array then place rear to start (circular array) 
                    front = 0;
                    new_array[i] = queue[front++];
                } else                                        //else just increment the array
                    new_array[i] = queue[front++];
                prev_size--;                                  //keep decreasing no of element as you add the elements to the new array
                i++;                                          //increase the index of new array
            }
            front = 0;                                        //assign front to 0
            rear = i-1;                                       //assign rear to the last index of added element
            capacity=new_capacity;                            //assign the new capacity
            queue=new_array;                                  //now queue will point to new array (bigger circular array)
        }
    
        public int getSize() {
            return (capacity - front + rear) % capacity;                  //formula to get no of elements present in circular queue
        }
    
        public int deQueue() throws Exception {
            if (isEmpty())                                       //if queue is empty
                throw new Exception("Queue is empty");
            else {
                int item = queue[front];                        //get item from front
                if (front == rear)                              //if only one element
                    front = rear = -1;
                else if (front == capacity)                     //front reached the end of array then place rear to start (circular array)
                    front = 0;
                else
                    front++;                                    //increment front by one
                decreaseSize();                                 //check if size of the queue can be reduced to half
                return item;                                    //return item from front
            }
    
        }
    
        public void decreaseSize(){                           //function to decrement size of circular array dynamically
            int prev_size = getSize();
            if(prev_size=0){                          //while no of elements are present in the queue
                    if(i==0)                                  //if index==0 place the first element
                        new_array[i]=queue[front++];
                    else if(front==capacity){                 //front reached the end of array then place rear to start (circular array)      
                        front=0;
                        new_array[i]=queue[front++];
                    }
                    else
                        new_array[i]=queue[front++];         //else just add the element present in index of front
                    prev_size--;                             //decrease the no of elements after putting to new array 
                    i++;                                     //increase the index of i
                }
                front=0;                                     //assign front to 0
                rear=i-1;                                    //assign rear to index of last element present in new array(queue)
                capacity=capacity/2;                         //assign new capacity (half the size of prev)
                queue=new_array;                             //now queue will point to new array (or new queue)
            }
        }
    
        public void display() {                           //function to display queue
            int size = getSize();
            int index = front;
    
            while (size >= 0) {
                if (isEmpty())
                    System.out.println("Empty queue");
                else if (index == capacity)
                    index = 0;
                System.out.print(queue[index++] + "=>");
                size--;
            }
            System.out.println("  Capacity: "+capacity);
    
        }
    
    }
    

    Output:

    --dynamic circular queue--

    1=> Capacity: 2

    1=>2=> Capacity: 2

    1=>2=>3=> Capacity: 4

    1=>2=>3=>4=> Capacity: 4

    4=>5=> Capacity: 2

提交回复
热议问题