数据结构 | C语言实现队列的顺序和链式结构

本文介绍了如何使用C语言实现队列的两种存储结构:顺序结构和链式存储。顺序结构中,通过数组和前后指针实现先进先出规则,并详细说明了初始化、入队、出队的操作;链式存储则利用带有头尾指针的结构体避免了队列满的问题,头指针作为辅助,实际元素从第二个节点开始。
摘要由CSDN通过智能技术生成

队列的顺序结构实现

队列遵循的是先进先出的规则,我们使用一个定长数组和队头队尾两个指针来完成这个结构。
顺序结构使用结构体来表示,如下:

#define maxsize 100

typedef struct {
   
	int data[maxsize]; // 定长数组存放队列元素
	int front, rear; // 队头队尾指针
}Queue;

我这里实现的队列,front指针是一个队头结点,无意义,front+1所在位置才是队伍第一个元素,有点类似链表的头结点~
这里需要明确几个操作状态:

  1. 初始化:front = rear = 0;
  2. 进队:队不满,data[ ++ rear] = value;
  3. 出队:队非空,data[++front] = value,然后返回元素;

循环队列可以保证充分地利用数组空间。我们使用+1取余的方式来循环 front rear指针。

  1. front ++ -> front = (front + 1) % maxsize
  2. rear ++ -> rear = (rear + 1 ) % maxsize
  3. 长度为 (rear - front ) % maxsize

实现代码如下:

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

#define MAXSIZE 200
#define ERROR -1

typedef struct QNode* Queue;
typedef struct QNode QNode;

struct QNode{
   
    int data[MAXSIZE];
    int rear;  // rear所在位置就是刚入队元素的位置
    int front; // front的位置表示队头
    // 当 rear + 1 % MAXSIZE == front时,队满;
    // 当 rear == front 时,队空
    // 当删除时,front 向前移动一个位置;
    // 当处于边界的时候,可以考虑 + 1 % maxsize 实现循环移动指针的效果。
};

Queue initialQueue(){
   
    Queue Q = (Queue)malloc(sizeof(QNode));
    Q->rear=Q->front=0;
    return Q;
}

bool addQ(Queue Q,int item){
   
    /*添加元素的方法是:先移动rear指针,然后在rear所指的位置记录数据*/
    if(Q->rear + 1 % MAXSIZE == Q->front)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值