数据结构之队列

什么是队列

队列是一种特殊的[线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队头front

删除数据的一端。对于数组,从后面插入更容易,前面插入较困难,所以一般用数组实现的队列队头在前面。(删除,直接index游标前进,不超过队尾即可)。而对于链表。插入删除在两头分别进行那么头部(前面)删除尾部插入是最方便的选择。

队尾rear

插入数据的一端,同上,在数组和链表中通常均在尾部位置

特点

元素只能从队列的一端进入,从另一端出去

队列中各个元素的进出必须遵循“先进先出”的原则,即最先入队的元素必须最先出队。

顺序队列的具体实现

通常情况下,我们采用 C 语言中的数组实现顺序表。既然用顺序表模拟实现队列,必然要先定义一个足够大的数组。不仅如此,为了遵守队列中数据从 “队尾进,队头出” 且 “先进先出” 的规则,还需要定义两个变量(top 和 rear)分别记录队头和队尾的具体位置。

实现入队

当有新元素入队时,依次执行以下两步操作:

  1. 将新元素存储在 rear 记录的位置;
  2. 更新 rear 的值(rear+1),记录下一个空闲空间的位置,为下一个新元素入队做好准备。
    int enQueue(int* a, int rear, int data) {
        //如果 rear 超出数组下标范围,队列将无法继续添加元素
        if (rear == MAX_LEN) {
            printf("队列已满,添加元素失败\n");
            return rear;
        }
        a[rear] = data;
        rear++;
        return rear;
    }

实现出队

当有元素出队时,根据“先进先出”的原则,目标元素以及在它之前入队的元素要依次从队头出队。

出队操作的实现方法很简单,就是更新 top 的值(top+1)。

    int deQueue(int* a, int top, int rear) {
        //如果 top==rear,表示队列为空
        if (top== rear) {
            printf("队列已空,出队执行失败\n");
            return top;
        }
        printf("出队元素:%d\n", a[top]);
        top++;
        return top;
    }

完整代码参考

    #include <stdio.h>
    #define MAX_LEN 100 //规定数组的长度
    //实现入队操作
    int enQueue(int* a, int rear, int data) {
        //如果 rear 超出数组下标范围,队列将无法继续添加元素
        if (rear == MAX_LEN) {
            printf("队列已满,添加元素失败\n");
            return rear;
        }
        a[rear] = data;
        rear++;
        return rear;
    }
    //实现出队操作
    int deQueue(int* a, int top, int rear) {
        //如果 top==rear,表示队列为空
        if (top == rear) {
            printf("队列已空,出队执行失败\n");
            return top;
        }
        printf("出队元素:%d\n", a[top]);
        top++;
        return top;
    }
    int main() {
        int a[MAX_LEN];
        int top, rear;
        //设置队头指针和队尾指针,当队列中没有元素时,队头和队尾指向同一块地址
        top = rear = 0;
        //入队
        rear = enQueue(a, rear, 1);
        rear = enQueue(a, rear, 2);
        rear = enQueue(a, rear, 3);
        rear = enQueue(a, rear, 4);
        //出队
        top = deQueue(a, top, rear);
        top = deQueue(a, top, rear);
        top = deQueue(a, top, rear);
        top = deQueue(a, top, rear);
        top = deQueue(a, top, rear);
        return 0;
    }
2025-04-01 10:40:39.023 INFO [io.undertow.servlet] - Initializing Spring DispatcherServlet 'dispatcherServlet' 2025-04-01 10:40:39.025 INFO [org.springframework.web.servlet.DispatcherServlet] - Initializing Servlet 'dispatcherServlet' 2025-04-01 10:40:39.026 TRACE [org.springframework.web.servlet.DispatcherServlet] - Detected org.springframework.web.multipart.commons.CommonsMultipartResolver@58ec8271 2025-04-01 10:40:39.026 TRACE [org.springframework.web.servlet.DispatcherServlet] - Detected org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver@398694a6 2025-04-01 10:40:39.026 TRACE [org.springframework.web.servlet.DispatcherServlet] - Detected org.springframework.web.servlet.theme.FixedThemeResolver@3df04fa1 2025-04-01 10:40:39.028 TRACE [org.springframework.web.servlet.DispatcherServlet] - Detected DefaultRequestToViewNameTranslator 2025-04-01 10:40:39.029 TRACE [org.springframework.web.servlet.DispatcherServlet] - Detected SessionFlashMapManager 2025-04-01 10:40:39.030 DEBUG [org.springframework.web.servlet.DispatcherServlet] - enableLoggingRequestDetails='false': request parameters and headers will be masked to prevent unsafe logging of potentially sensitive data 2025-04-01 10:40:39.030 INFO [org.springframework.web.servlet.DispatcherServlet] - Completed initialization in 5 ms 2025-04-01 10:40:39.049 TRACE [org.springframework.web.servlet.DispatcherServlet] - GET "/big-screen/get-time-period-traffic?deviceType=3", parameters={masked}, headers={masked} in DispatcherServlet 'dispatcherServlet' 2025-04-01 10:40:39.050 TRACE [o.s.w.s.m.m.a.RequestMappingHandlerMapping] - Mapped to com.syzn.dv.biz.bigscreen.northbound.controller.BigScreenController#getTimePeriodTraffic(BigScreenCommonReq) 2025-04-01 10:40:39.074 TRACE [org.springframework.web.method.HandlerMethod] - Arguments: [BigScreenCommonReq(direction=null, deviceType=3, startDate=null, endDate=null)] 2025-04-01 10:40:39.088 DEBUG [org.mybatis.spring.SqlSessionUtils] - Creating a new SqlSession 2025
最新发布
04-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小猿--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值