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()
{
}
累死我了