数据结构-用数组实现队列

队列的定义:队列是一种特殊的线性表,只允许在表的头部(front处)进行删除操作,在表的尾部(rear处)进行插入操作的线性数据结构,这种结构就叫做队列。进行插入操作的一端称为队尾,进行删除操作的一端称为队头。

数组实现的队列会定义一段空间用于存放数据,另外一个front队头指针,一个rear队尾指针,队头指针指向队列的第一个元素,队尾指针指向队列最后一个元素的下一位。数据入队列时,队尾指针增加一位,出队列时,队头指针增加一位。

队列一般设计成循环队列,因为如果是非循环队列的话,进行数据插入、删除时,front、rear指针会一直增加,之前的位置就无法在使用到,会造成浪费。所以接下来我们就实现循环队列。

队列结构体:

typedef struct 
{
    ElemType *elem;    //存放数据内容
    int front;    //队列头
    int rear;    //队列尾
    int maxSize;    //队列大小
}QUEUE_SQ;

非循环队列: 

循环队列:

 

接口:

//初始化队列
void InitQueue(QUEUE_SQ &sq, int size);
//判断队列是否为空
bool isEmptyQueue(QUEUE_SQ sq);
//入队列
void PushQueue(QUEUE_SQ &sq, int elem);
//出队列
void PopQueue(QUEUE_SQ &sq);
//获取队列最前面数据
ElemType GetRearElem(QUEUE_SQ sq);
//获取队列元素个数
int GetNumElem(QUQUE_SQ sq);
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
using std::cout;
using std::endl;
typedef int ElemType;
typedef struct
{
    ElemType *elem;
    int front;
    int rear;
    int maxSize;
}QUEUE_SQ;
//初始化队列
void InitQueue(QUEUE_SQ &sq, int size)
{
    sq.elem = (ElemType *)malloc(size * sizeof(ElemType));
    sq.front = 0;
    sq.rear = 0;
    sq.maxSize = size;
}
//判断队列是否为空
bool isEmptyQueue(QUEUE_SQ sq)
{
    if(sq.front == sq.rear) 
        return true;
    return false;
}
//判断队列是否满
bool isFullQueue(QUEUE_SQ sq)
{
    if( (sq.rear + 1)%(sq.maxSize) == sq.front )
        return true;
    return false;
}
//入队列
void PushQueue(QUEUE_SQ &sq,int elem)
{
    if(isFullQueue(sq))
    {
        cout<<"queue is full!"<<endl;
        return;
    }
    cout<<"push queue:"<<elem<<endl;
    sq.elem[sq.rear] = elem; 
    sq.rear = (sq.rear + 1)%(sq.maxSize);
}
//出队列
void PopQueue(QUEUE_SQ &sq)
{
    if(isEmptyQueue(sq))
    {
        cout<<"queue is empty!"<<endl;
        return;
    } 
    ElemType e = sq.elem[sq.front];    
    cout<<"pop stack:"<<e<<endl;
    sq.front = (sq.front + 1)%(sq.maxSize);
}
//获取队列元素个数
int GetNumElem(QUEUE_SQ sq)
{
    if(isEmptyQueue(sq))
    {
        cout<<"queue is empty!"<<endl;
        return 0;
    }
    int num = sq.rear - sq.front;
    return num;
}
const int SIZE = 10;
int main()
{
    QUEUE_SQ sq;
    InitQueue(sq, SIZE);
    PushQueue(sq, 10);
    PushQueue(sq, 20);
    PushQueue(sq, 30);
    cout<<"num elem:"<<GetNumElem(sq)<<endl;
    PopQueue(sq);
    PopQueue(sq);
    PopQueue(sq);
    cout<<"num elem:"<<GetNumElem(sq)<<endl;
    return 0;
}

打印结果:

push queue:10
push queue:20
push queue:30
num elem:3
pop stack:10
pop stack:20
pop stack:30
queue is empty!
num elem:0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值