用数组实现队列

本文介绍了一个简单的队列数据结构的实现方法。该队列使用数组作为底层存储,并提供了enqueue和dequeue等基本操作。文章详细解释了如何通过enqueue方法在队列中添加元素以及如何通过dequeue方法移除并返回队列头部的元素。
package com.example;

/**
 * description
 *
 * @author zhanghaohao089
 * @date 2017/8/15
 */

public class Queue {

    private int[] array;
    private int front;
    private int max;
    private int count;
    private int end;

    public Queue(int max) {
        this.max = max;
        array = new int[max];
        front = 0;
        end = -1;
    }

    public boolean isEmpty() {
        return count == 0;
    }

    public boolean isFull() {
        return count == max;
    }

    public void enqueue(int t, boolean pro) {
        if (isFull())
            throw  new IllegalAccessError("IS FULL");
        if (++end == max)
            end = 0;
        array[end] = t;
        count ++;
    }

    public int dequeue() {
        if (isEmpty())
            throw new NullPointerException("is null");
        int value = array[front];
        array[front] = -1;
        front++;
        if (front == max)
            front = 0;
        count --;
        return value;
    }

}
在C语言中,使用数组实现队列通常可以采用两种方式:普通队列和循环队列。 ### 普通队列 普通队列是一种先进先出(FIFO)的数据结构,通过数组实现时,需要定义一个数组来存储元素,同时使用两个变量`front`和`rear`分别表示队列的队头和队尾。 ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 typedef int QueueDataType; typedef struct Queue { QueueDataType arr[MAX_SIZE]; int front; int rear; } Queue; // 初始化队列 void initQueue(Queue *q) { q->front = 0; q->rear = 0; } // 判断队列是否为空 int isEmpty(Queue *q) { return q->front == q->rear; } // 判断队列是否已满 int isFull(Queue *q) { return q->rear == MAX_SIZE; } // 入队操作 void enqueue(Queue *q, QueueDataType value) { if (isFull(q)) { printf("Queue is full!\n"); return; } q->arr[q->rear++] = value; } // 出队操作 QueueDataType dequeue(Queue *q) { if (isEmpty(q)) { printf("Queue is empty!\n"); return -1; } return q->arr[q->front++]; } // 获取队头元素 QueueDataType front(Queue *q) { if (isEmpty(q)) { printf("Queue is empty!\n"); return -1; } return q->arr[q->front]; } int main() { Queue q; initQueue(&q); enqueue(&q, 10); enqueue(&q, 20); enqueue(&q, 30); printf("Front element: %d\n", front(&q)); printf("Dequeued element: %d\n", dequeue(&q)); printf("Front element after dequeue: %d\n", front(&q)); return 0; } ``` ### 循环队列 循环队列是对普通队列的一种改进,它可以更有效地利用数组空间。通过取模运算,当队尾指针到达数组末尾时,可以回到数组开头。 ```c #include <stdio.h> #include <stdlib.h> typedef int CQueueDataType; typedef struct MyCircularQueue { CQueueDataType* a; int front; int rear; int k; } MyCircularQueue; // 初始化循环队列 MyCircularQueue* myCircularQueueCreate(int k) { MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue)); obj->a = (CQueueDataType*)malloc(sizeof(CQueueDataType) * (k + 1)); obj->front = 0; obj->rear = 0; obj->k = k; return obj; } // 判断循环队列是否为空 int myCircularQueueIsEmpty(MyCircularQueue* obj) { return obj->front == obj->rear; } // 判断循环队列是否已满 int myCircularQueueIsFull(MyCircularQueue* obj) { return (obj->rear + 1) % (obj->k + 1) == obj->front; } // 入队操作 int myCircularQueueEnQueue(MyCircularQueue* obj, int value) { if (myCircularQueueIsFull(obj)) { return 0; } obj->a[obj->rear] = value; obj->rear = (obj->rear + 1) % (obj->k + 1); return 1; } // 出队操作 int myCircularQueueDeQueue(MyCircularQueue* obj) { if (myCircularQueueIsEmpty(obj)) { return 0; } obj->front = (obj->front + 1) % (obj->k + 1); return 1; } // 获取队头元素 int myCircularQueueFront(MyCircularQueue* obj) { if (myCircularQueueIsEmpty(obj)) { return -1; } return obj->a[obj->front]; } // 获取队尾元素 int myCircularQueueRear(MyCircularQueue* obj) { if (myCircularQueueIsEmpty(obj)) { return -1; } return obj->a[(obj->rear - 1 + obj->k + 1) % (obj->k + 1)]; } // 释放循环队列 void myCircularQueueFree(MyCircularQueue* obj) { free(obj->a); free(obj); } int main() { MyCircularQueue* obj = myCircularQueueCreate(3); myCircularQueueEnQueue(obj, 1); myCircularQueueEnQueue(obj, 2); myCircularQueueEnQueue(obj, 3); printf("Rear element: %d\n", myCircularQueueRear(obj)); myCircularQueueDeQueue(obj); printf("Front element after dequeue: %d\n", myCircularQueueFront(obj)); myCircularQueueFree(obj); return 0; } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值