队列的实现(数组队列)C/C++

文章介绍了如何使用数组来实现队列的基本操作,包括初始化、入队、出队和销毁。在入队时,如果空间不足会动态扩展内存。出队时,会检查边界并循环使用数组空间。作者提到虽然数组实现较为繁琐,但通过动态内存管理可以解决一些问题。
摘要由CSDN通过智能技术生成

1.基本介绍

队列的基本形式在上一篇链表队列已经介绍过了,这篇文章将用数组的形式来实现队列

(个人不建议用数组队列,各种判断边界烦死了,明明有链表列那么简单的方式还要给自己没事找事,烦死了)

开了这个坑我就后悔了,各种边界判断,各种坑快把我给埋了,接下来开整(傲娇.jpg)

2.初始化(其实就是分配空间)

typedef struct Mnode
{
    int* top;                      //队头指针
    int* rear;                     //队尾指针
    int lengh;                     //数据长度
    int* begin;                    //数组队列基址
    int count;                     //内存总长
}*Linknode,node;              /*这里特别说明一下,定义这两个名称单纯为了下面用的时候方便一点,也可以不定义*Linknode,在使用的时候直接用node*代替*/

3.入队

由队列定义,只允许在尾部,这一点是通过队尾指针控制的

 void Insert(Linknode L, int n)                          //入队
 {
     int x;
     cin >> x;
     for (int k = 0; k < n; k++)                           
     {
         if ((n + L->lengh) >= INIT_SIZE)              //当最初分配的空间不够将向其中分配新的空间
         {
             L->begin = (int*)realloc(L, sizeof(int) * LISTINCREMENT);
             L->top = L->begin;
             L->rear = &L->begin[L->lengh];
             L->count += LISTINCREMENT;
         }
         if(L->rear!=&L->begin[L->count-1])               //这个判断的作用在于判断是否尾结点指向最后一位如果是那么跳回第一个结点
         { 
             L->rear += 1;
         }
         else
         {
             L->rear = L->begin;
         }
         *L->rear = x;
         L->lengh += 1;
     }
 }

4.出队

队列只允许从队头出队,这一点通过队头指针控制

 vector<int>arr(Linknode L,int n)          //将出队的数据记录到一个vector对象中
 {
     vector<int>arr(n);
     if (n <= L->lengh)
     {
         for(int k=1;k<=n;k++)
         { 
             arr[k - 1] = *L->top;
             if (L->top != &L->begin[L->count - 1])         //判断是否到边界,到边界则循环回去
             {
                 L->top += 1;
             }
             else
             {
                 L->top = L->begin;
             }
             L->lengh -= 1;
         }
     }
     return arr;
 }

5.销毁

看他不爽很久了,毁了算了(其实在使用完内存空间后及时释放是个好习惯)

void Distory(Linknode L)                                       //销毁队列
 {
     free(L->begin);
     L->top = NULL;
     L->rear = NULL;
     free(L);                                       //销毁的实质:释放所有空间,指针全部指向空
 }

6.完整代码

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
const int INIT_SIZE = 100;
const int LISTINCREMENT = 10;

typedef struct Mnode
{
    int* top;                      //队头指针
    int* rear;                     //队尾指针
    int lengh;                     //数据长度
    int* begin;                    //数组队列基址
    int count;                     //内存总长
}*Linknode,node;


 Linknode crease()                //初始化队列
{
     Linknode L;
     L = (Linknode)malloc(sizeof(node));                  //为结构体本身存储赋予空间
     L->begin = (int*)malloc(sizeof(int) * INIT_SIZE);    //对列中元素的存储空间
     L->top = L->begin;                                   
     L->rear = L->begin;                                  //初始化队头指针队尾指针
     L->lengh = 0;     
     L->count = INIT_SIZE;                               //定义一个count用来限定边界以合理的进行循环
     return L;
}

 void Insert(Linknode L, int n)                          //入队
 {
     int x;
     cin >> x;
     for (int k = 0; k < n; k++)                           
     {
         if ((n + L->lengh) >= INIT_SIZE)              //当最初分配的空间不够将向其中分配新的空间
         {
             L->begin = (int*)realloc(L, sizeof(int) * LISTINCREMENT);
             L->top = L->begin;
             L->rear = &L->begin[L->lengh];
             L->count += LISTINCREMENT;
         }
         if(L->rear!=&L->begin[L->count-1])               //这个判断的作用在于判断是否尾结点指向最后一位如果是那么跳回第一个结点
         { 
             L->rear += 1;
         }
         else
         {
             L->rear = L->begin;
         }
         *L->rear = x;
         L->lengh += 1;
     }
 }

 vector<int>arr(Linknode L,int n) 
 {
     vector<int>arr(n);
     if (n <= L->lengh)
     {
         for(int k=1;k<=n;k++)
         { 
             arr[k - 1] = *L->top;
             if (L->top != &L->begin[L->count - 1])              //判断是否到边界,到边界则循环回去
             {
                 L->top += 1;
             }
             else
             {
                 L->top = L->begin;
             }
             L->lengh -= 1;
         }
     }
     return arr;
 }


 void Distory(Linknode L)                                               //销毁队列
 {
     free(L->begin);
     L->top = NULL;
     L->rear = NULL;
     free(L);                                                          //释放所有空间,指针全部指向空
 }


 int main()
 {

 }

累死我了

我再也不给自己挖坑了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值