C语言用指针支持队列

为了使用指针来支持队列,我们需要定义一个结构体来表示队列。该结构体至少需要包括两个指针分别指向队列的头和尾,以及队列的大小。以下是一个示例:

struct queue {
    int *data;  // 存储队列元素的数据
    int front;  // 队列头
    int rear;   // 队列尾
    int size;   // 队列大小
};

接下来,我们可以使用以下函数来实现对队列的一些基本操作:

  1. create_queue:创建队列
  2. enqueue:入队
  3. dequeue:出队
  4. is_empty:判断队列是否为空
  5. is_full:判断队列是否已满
  6. get_front:获取队列头元素
  7. get_rear:获取队列尾元素
  8. destroy_queue:销毁队列

下面是一些示例代码,用于说明如何使用上述函数:

#include <stdio.h>
#include <stdlib.h>

struct queue {
    int *data;
    int front;
    int rear;
    int size;
};

struct queue *create_queue(int size) {
    struct queue *q = (struct queue *) malloc(sizeof(struct queue));
    q->data = (int *) malloc(sizeof(int) * size);
    q->front = q->rear = -1;
    q->size = size;
    return q;
}

int is_empty(struct queue *q) {
    return q->front == -1;
}

int is_full(struct queue *q) {
    return q->front == (q->rear + 1) % q->size;
}

void enqueue(struct queue *q, int value) {
    if (is_full(q)) {
        printf("Queue is full\n");
        return;
    }
    if (is_empty(q)) {
        q->front = q->rear = 0;
        q->data[0] = value;
    } else {
        q->rear = (q->rear + 1) % q->size;
        q->data[q->rear] = value;
    }
}

int dequeue(struct queue *q) {
    if (is_empty(q)) {
        printf("Queue is empty\n");
        return -1;
    }
    int value = q->data[q->front];
    if (q->front == q->rear) {
        q->front = q->rear = -1;
    } else {
        q->front = (q->front + 1) % q->size;
    }
    return value;
}

int get_front(struct queue *q) {
    if (is_empty(q)) {
        printf("Queue is empty\n");
        return -1;
    }
    return q->data[q->front];
}

int get_rear(struct queue *q) {
    if (is_empty(q)) {
        printf("Queue is empty\n");
        return -1;
    }
    return q->data[q->rear];
}

void destroy_queue(struct queue *q) {
    free(q->data);
    free(q);
}

int main() {
    struct queue *q = create_queue(5);
    enqueue(q, 1);
    enqueue(q, 2);
    enqueue(q, 3);
    printf("front of queue: %d\n", get_front(q));
    printf("rear of queue: %d\n", get_rear(q));
    printf("dequeue: %d\n", dequeue(q));
    printf("front of queue: %d\n", get_front(q));
    printf("rear of queue: %d\n", get_rear(q));
    enqueue(q, 4);
    enqueue(q, 5);
    printf("enqueue: 4, 5\n");
    printf("is_full: %d\n", is_full(q));
    while (!is_empty(q)) {
        printf("dequeue: %d\n", dequeue(q));
    }
    printf("is_empty: %d\n", is_empty(q));
    destroy_queue(q);
    return 0;
}

以上代码演示了如何创建一个大小为5的队列,并对其进行入队和出队等操作。每次入队、出队、获取队列头尾元素时,都需要先判断队列是否为空或已满。最后销毁队列。当然,该代码示例并不是所有实现队列的情况。在实际中,可能还需要增加更多功能,才能实现我们真正需要的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言用指针支持队列 - Python技术站

(0)
上一篇 2023年5月9日
下一篇 2023年5月9日

相关文章

  • VC中CWinThread类以及和createthread API的区别分析

    VC中CWinThread类是MFC(Microsoft Foundation Class)中提供的一个类,用于创建和管理Windows应用程序中的线程。这个类可以方便的管理线程的运行、暂停、停止和同步等操作,可以大大提高程序的可读性和可维护性。 与CWinThread类相比,CreateThread API函数则是Windows API中用于创建线程的函数…

    C 2023年5月22日
    00
  • Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结(分享) 介绍 本文是对Linux下C语言的几道经典面试题进行的总结与分享。在C语言面试中,几道经典的问题一般都是用来测试面试者的基础知识和实际操作能力。在此处,将讨论面试中可能出现的几道经典问题,并提供相应答案和解释。本文将涵盖以下几个部分: 基本数据类型 数组和字符串 指针和内存 函数和指针 基本数据类型 问题1:s…

    C 2023年5月23日
    00
  • python访问纯真IP数据库的代码

    Python访问纯真IP数据库的代码完整攻略 纯真IP数据库是一款用于IP地址查询的软件,可以通过输入一个IP地址来查询对应的区域、省份、城市等信息。在Python中,可以通过访问纯真IP数据库来实现这一功能。下面是实现该功能的完整攻略。 步骤一:下载纯真IP数据库 首先需要从纯真官网下载最新版纯真IP数据库,下载后,解压压缩包,可以得到一个名为“QQWry…

    C 2023年5月23日
    00
  • JDK 7 新特性小结实例代码解析

    JDK 7 新特性小结实例代码解析 简介 JDK 7 是 Java Development Kit 的版本号,是 Java 的一个版本。JDK 7 主要添加了许多新特性,包括小型语言改进、文件访问/输入和输出的 I/O 改进、内部脚本引擎、实例创建类型推断、字符串开头的结尾和 switch 语句中的字符串变量、数字下划线等。本文将从例子出发,详细地介绍 JD…

    C 2023年5月23日
    00
  • C 语言基础教程(我的C之旅开始了)[五]

    下面详细讲解“C语言基础教程(我的C之旅开始了)[五]”的完整攻略。 标题 C 语言基础教程(我的 C 之旅开始了)[五] 概述 本次教程主要涵盖C语言中的结构体和联合体。在学习本篇教程前,需要先掌握C语言中的变量、循环、条件语句、指针等基础知识。 结构体 结构体是 C 语言中自定义的一种数据类型,通过结构体可以将多个不同类型的变量组合成一个整体,方便统一管…

    C 2023年5月23日
    00
  • 详解JS ES6变量的解构赋值

    详解JS ES6变量的解构赋值 ES6(ECMAScript 2015)引入了一种新的变量赋值方式–解构赋值(Destructuring Assignment),使得我们可以更加简洁地从数组或者对象中提取值,并赋值给新的变量。本攻略将详细讲解JS ES6变量的解构赋值。 数组的解构赋值 让我们先看一个简单的例子:如何用传统的方式(不使用解构赋值)从数组中获…

    C 2023年5月23日
    00
  • C语言字符串字面量池

    C语言字符串字面量池是一个常量池,其中存储在程序中出现的所有字符串字面量。使用字符串字面量池是一种优化技术,因为它允许多个字符串变量共享相同的内存地址,这样可以减少内存消耗。 在C语言中,无论字符串以何种方式定义,它都是一个字符数组,其中最后一个字符必须是空字符(\0)。将字符串字面量赋值给字符数组实际上是将字符串字面量的地址赋给字符数组指针。这个地址是指向…

    C 2023年5月9日
    00
  • C语言学好递归看这一篇就够了

    C语言学好递归看这一篇就够了 什么是递归 递归(Recursion)是指在函数定义中使用函数自身的方法,是一种常用的解决问题的方法,通过不断调用自身,将大问题分解为小问题解决,最终达到解决整个问题的目的。 递归的三要素 递归包含三个要素:- 递归出口- 递归调用- 递归返回 递归示例一:求斐波那契数列第n项 斐波那契数列是指每一项都等于它前面两项的和,第一项…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部