顺序队列

顺序队列

基本概念

  • 队列是一种特殊的线性表
  • 队列仅在线性表的两端进行操作
  • 队头(Front):取出数据元素的一端(虽然用顺序表的头部和尾部效果一样,但这里我们使用顺序表的头部作为队列头部–从这里取出元素)
  • 队尾(Rear):插入数据元素的一端(这里我们使用顺序表的尾部作为队列尾部部–从这里插入元素))
  • 队列不允许在中间部位进行操作!
    这里写图片描述

常用操作

  • 销毁队列
  • 清空队列
  • 进队列
  • 出队列
  • 获取队头元素
  • 获取队列的长度

代码实现

  • 头文件
#ifndef __SEQQUEUE_H__
#define __SEQQUEUE_H__

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

typedef void SeqQueue;//数据类型封装
typedef void SeqQueueNode;//基于顺序表的栈和队列都不需要对数据对象进行包装
                            //基于链式存储的线性表则需要将栈或者队列的业务节点包含在链表节点中

/*创建指定容量的队列*/
SeqQueue *SeqQueue_Create(int capacity);

/*销毁队列*/
void SeqQueue_Destroy(SeqQueue * queue);

/*清空队列*/
void SeqQueue_Clear(SeqQueue * queue);


/*往队列插入元素--尾部插入*/
int SeqQueue_Append(SeqQueue * queue, SeqQueueNode *item);

/*从队列取出元素--头部取出*/
SeqQueueNode *SeqQueue_Retrieve(SeqQueue * queue);

/*获取队列头部的元素--以上三个函数得到的都是数据对象的首地址*/
SeqQueueNode *SeqQueue_Header(SeqQueue * queue);

/*队列长度*/
int SeqQueue_Length(SeqQueue * queue);

/*队列容量*/
int SeqQueue_Capacity(SeqQueue * queue);

#endif
  • 实现文件
#include "seqqueue.h"
#include "seqlist.h"


SeqQueue *SeqQueue_Create(int capacity)
{
    return SeqList_Create(capacity);
}

void SeqQueue_Destroy(SeqQueue * queue)
{
    SeqList_Destroy((SeqList*)queue);
}
void SeqQueue_Clear(SeqQueue * queue)
{
    SeqList_Clear((SeqList*)queue);
}

int SeqQueue_Append(SeqQueue * queue, SeqQueueNode *item)
{
    /*插入的时候,插入位置就是当前队列的长度对应的位置*/
    return SeqList_Insert((SeqList*)queue, (SeqListNode*)item, SeqQueue_Length(queue));
}

SeqQueueNode *SeqQueue_Retrieve(SeqQueue * queue)
{
    return SeqList_Delete((SeqList*)queue, 0);
}
SeqQueueNode *SeqQueue_Header(SeqQueue * queue)
{
    return SeqList_Get((SeqList*)queue,0);
}

int SeqQueue_Length(SeqQueue * queue)
{
    return SeqList_Length((SeqList*)queue);
}
int SeqQueue_Capacity(SeqQueue * queue)
{
    return SeqList_Capacity((SeqList*)queue);
}
  • 测试文件
#include "seqqueue.h"

int main(void)
{
    int  i = 0;
    int a[10] = {0};
    SeqQueue *queue = NULL;


    queue = SeqQueue_Create(10);
    if (queue == NULL)
    {
        printf("create error!\n");
        return -1;
    }

    for (i = 0; i < 5;i++)
    {
        a[i] = i + 1;
        SeqQueue_Append(queue, &a[i]);
    }

    printf("len:%d\n",SeqQueue_Length(queue));
    printf("header:%d\n", *(int *)SeqQueue_Header(queue));
    printf("capacity:%d\n", SeqQueue_Capacity(queue));

    while (SeqQueue_Length(queue)>0)
    {
        printf("var:%d\n", *(int *)SeqQueue_Retrieve(queue));
    }

    SeqQueue_Destroy(queue);

    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值