鱼C论坛

 找回密码
 立即注册
查看: 1586|回复: 0

[学习笔记] 007-队列

[复制链接]
发表于 2018-9-26 23:02:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、基本概念
队列(queue)是一种 特殊的线性表
队列仅在线性表的两端进行操作;
队头(Front):取出数据元素的一端;
队尾(Rear):   插入数据元素的一端。
队列不允许在中间位置插入元素或其他操作。
        队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。是一种先进先出的线性表(FIFO).
112.jpg

常用操作:
        创建队列;
        销毁队列;
        清空队列;
        进队列;
        出队列;
        获取队头元素;
        获取队列的长度。
2、队列的线性存储
      同样由于队列是一种特殊的线性表,其实现也是可以通过线性表来完成的。
通过线性表的顺序存储来实现队列的顺序 存储。
// 创建一个队列  相当于 创建一个线性表
SeqQueue* SeqQueue_Create(int capacity)
{
        return SeqList_Create(capacity);
}

// 销毁一个队列  相当于 销毁一个线性表 
void SeqQueue_Destroy(SeqQueue* queue)
{
        SeqList_Destroy(queue);
}

// 清空一个队列  相当于 清空一个线性表 
void SeqQueue_Clear(SeqQueue* queue)
{
        SeqList_Clear(queue);
}

// 入队  相当于 向线性表添加一个元素
// 头插、尾插都可以,这里选择尾插法
int SeqQueue_Append(SeqQueue* queue, void* item)
{
        return SeqList_Insert(queue, item, SeqQueue_Length(queue));
}

// 出队 相当于 删除链表头部元素
void* SeqQueue_Retrieve(SeqQueue* queue)
{
        return SeqList_Delete(queue, 0);
}

// 获取队列头部元素 相当于 获取线性表头部元素
void* SeqQueue_Header(SeqQueue* queue)
{
        return SeqList_Get(queue, 0);
}

// 获取队列长度  相当于 获取线性表长度 
int SeqQueue_Length(SeqQueue* queue)
{
        return SeqList_Length(queue);
}

// 获取队列容量  相当于 获取线性表容量
int SeqQueue_Capacity(SeqQueue* queue)
{
        return SeqList_Capacity(queue);
}
3、队列的链式存储
和栈类似,队列的链式存储同样涉及到  ① 队列的业务结点向线性表业务结点的转换    ② 结点的生命周期的管理。
// 队列也是一种特殊的线性表
// 队列的业务结点的数据结构
typedef struct _tag_LinkQueueNode
{
        LinkListNode node;
        void* item;
}TLinkQueueNode;



// 创建一个队列  相当于 创建一个线性表
LinkQueue* LinkQueue_Create()
{
        return LinkList_Create();
}

// 销毁一个队列  相当于 销毁一个线性表 
// 结点的内存管理
void LinkQueue_Destroy(LinkQueue* queue)
{
        LinkQueue_Clear(queue);
        LinkList_Destroy(queue);
}


// 清空一个队列  需要把队列里的每个元素取出来  释放掉
void LinkQueue_Clear(LinkQueue* queue)
{
        while (LinkQueue_Length(queue) > 0)
        {
                LinkQueue_Retrieve(queue);
        }
        LinkList_Clear(queue);
}


// 入队  相当于 向线性表添加一个元素
// 头插、尾插都可以,这里选择尾插法
int LinkQueue_Append(LinkQueue* queue, void* item)
{
        int ret = 0;
        TLinkQueueNode *tmp = NULL;
        tmp = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));
        if (tmp == NULL)
        {
                ret = -1;
                printf("Fun LinkQueue_Append() malloc error:%d", ret);
                return ret;
        }
        memset(tmp, 0, sizeof(TLinkQueueNode));
        tmp->item = item;
        // 需要把队列的业务结点 转换为 线性表的业务结点
         ret = LinkList_Insert(queue, (LinkListNode*)tmp, LinkList_Length(queue));
        if (ret != 0)
        {
                printf("Fun LinkList_Insert() error: %d\n", ret);
                if (tmp != NULL)
                {
                        free(tmp);
                        tmp = NULL;
                }
        }
        return ret;
}

// 从队列中删除一个元素 相当于  从线性表中删除一个元素
void* LinkQueue_Retrieve(LinkQueue* queue)
{
        TLinkQueueNode *tmp = NULL;
        void                   *ret = NULL;
        tmp = (TLinkQueueNode*)LinkList_Delete(queue, 0);
        if (tmp == NULL)
        {
                printf("Fun LinkList_Delete error\n");
                return NULL;
        }
        ret = tmp->item;
        if (tmp != NULL)
        {
                free(tmp);
        }
        return ret;
}

// 获取队列中头部元素 相当于  获取线性表的头部元素
void* LinkQueue_Header(LinkQueue* queue)
{
        TLinkQueueNode *tmp = NULL;
        void                   *ret = NULL;
        tmp = LinkList_Get(queue, 0);
        if (tmp == NULL)
        {
                printf("func LinkList_Get() reeor\n");
                return NULL;
        }
        return tmp->item;
}

// 求队列的长度 相当于 求线性表的长度
int LinkQueue_Length(LinkQueue* queue)
{
        return LinkList_Length(queue);
}
完整代码: 队列的顺序存储.zip (2.72 KB, 下载次数: 5)
                 队列的链式存储.zip (2.98 KB, 下载次数: 6)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 01:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表