zoukankan      html  css  js  c++  java
  • 数据结构与算法-queue

    队列和stack类似,stack是先进后出,而queue的先进先出,也是一种特殊的线性表

    基本概念

    概念

    队列是一种特殊的线性表
    队列仅在线性表的两端进行操作
    队头(Front):取出数据元素的一端
    队尾(Rear):插入数据元素的一端
    队列不允许在中间部位进行操作
    queue-概念

    常用操作

    • 销毁队列
    • 清空队列
    • 进队列
    • 出队列
    • 获取队头元素
    • 获取队列的长度
    #ifndef _MY_QUEUE_H_
    #define _MY_QUEUE_H_
    
    typedef void Queue;
    
    Queue* Queue_Create();
    
    void Queue_Destroy(Queue* queue);
    
    void Queue_Clear(Queue* queue);
    
    int Queue_Append(Queue* queue, void* item);
    
    void* Queue_Retrieve(Queue* queue);
    
    void* Queue_Header(Queue* queue);
    
    int Queue_Length(Queue* queue);
    
    #endif
    

    队列的顺序存储设计与实现

    (*.h)

    #ifndef __MY_SEQQUEUE_H_
    #define __MY_SEQQUEUE_H_
    
    typedef void SeqQueue;
    
    SeqQueue* SeqQueue_Create(int capacity);
    
    void SeqQueue_Destroy(SeqQueue* queue);
    
    void SeqQueue_Clear(SeqQueue* queue);
    
    int SeqQueue_Append(SeqQueue* queue, void* item);
    
    void* SeqQueue_Retrieve(SeqQueue* queue);
    
    void* SeqQueue_Header(SeqQueue* queue);
    
    int SeqQueue_Length(SeqQueue* queue);
    
    int SeqQueue_Capacity(SeqQueue* queue);
    
    #endif
    

    (*.c)

    #include <stdio.h>
    
    #include "seqqueue.h"
    #include "seqlist.h"
    
    //创建队列,相当于创建一个线性表
    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, SeqList_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);
    }
    

    (test)

    #include <stdio.h>
    
    #include "seqqueue.h"
    
    void main()
    {
    	int i, a[10];
    	SeqQueue *queue = NULL;
    
    	queue = SeqQueue_Create(10);
    
    	//向队列中放元素
    	for (i = 0; i < 10; i++)
    	{
    		a[i] = i + 1;
    		SeqQueue_Append(queue, &a[i]);
    	}
    
    	printf("the header of queue: %d 
    ", *((int *)SeqQueue_Header(queue)));
    	printf("the length of queue: %d 
    ", SeqQueue_Length(queue));
    	printf("the capacity of queue: %d 
    ", SeqQueue_Capacity(queue));
    
    	//删除队列
    	while (SeqQueue_Length(queue) > 0)
    	{
    		printf("%d 
    ", *((int *)SeqQueue_Retrieve(queue)));
    	}
    
    	SeqQueue_Destroy(queue);
    
    	system("pause");
    }
    

    队列的链式存储设计与实现

    (*.h)

    #ifndef __MY_LINKQUEUE_H_
    #define __MY_LINKQUEUE_H_
    
    typedef void LinkQueue;
    
    LinkQueue* LinkQueue_Create();
    
    void LinkQueue_Destroy(LinkQueue* queue);
    
    void LinkQueue_Clear(LinkQueue* queue);
    
    int LinkQueue_Append(LinkQueue* queue, void* item);
    
    void* LinkQueue_Retrieve(LinkQueue* queue);
    
    void* LinkQueue_Header(LinkQueue* queue);
    
    int LinkQueue_Length(LinkQueue* queue);
    
    #endif
    

    (*.c)

    #include <stdio.h>
    #include <stdlib.h>
    
    #include "linkqueue.h"
    #include "linklist.h"
    
    typedef struct _tag_LinkQueueNode
    {
    	LinkListNode	node;
    	void			*item;
    }TLinkQueueNode;
    
    //创建一个队列,相当于创建一个线性表
    LinkQueue* LinkQueue_Create() //O(1)
    {
    	return LinkList_Create();
    }
    
    void LinkQueue_Destroy(LinkQueue* queue) //O(1)
    {
    	LinkQueue_Clear(queue);
    	LinkList_Destroy(queue);
    }
    
    void LinkQueue_Clear(LinkQueue* queue) //O(n)
    {
    	while (LinkQueue_Length(queue) > 0)
    	{
    		LinkQueue_Retrieve(queue);
    	}
    	//LinkQueue_Clear(queue);
    }
    
    //向队列中添加元素,相当于向队列的尾部插入元素
    int LinkQueue_Append(LinkQueue* queue, void* item) //O(n)
    {
    	int					ret = 0;
    	TLinkQueueNode *	node = NULL;
    	//需要向linklist中添加业务节点,需要在业务节点中包含链表结点
    	//需要让链表结点放在业务节点的第一个成员域。
    	//把形参item,转换为 linklist识别的业务节点
    	node = (TLinkQueueNode *)malloc(sizeof(TLinkQueueNode));
    	if (node == NULL)
    	{
    		return -1;
    	}
    	memset(node, 0, sizeof(TLinkQueueNode));
    	node->item = item;
    
    	ret = LinkList_Insert(queue, (LinkListNode *)node, LinkList_Length(queue));
    	if (ret != 0)
    	{
    		free(node);
    		return -2;
    	}
    
    	return ret;
    }
    
    //从队列删除元素,相当于从队列的头部拿元素
    void* LinkQueue_Retrieve(LinkQueue* queue) //O(1)
    {
    	int			ret = 0;
    	void *		item = NULL;
    	TLinkQueueNode *node = NULL;
    	//需要向linklist中添加业务节点,需要在业务节点中包含链表结点
    	node = (TLinkQueueNode *)LinkList_Delete(queue, 0);
    	if (node == NULL)
    	{
    		return NULL;
    	}
    	item = node->item;
    	if (node != NULL)
    	{
    		free(node);
    		node = NULL;
    	}
    	return item;
    }
    
    //获取队列头元素,相当于从队列0位置拿元素
    void* LinkQueue_Header(LinkQueue* queue) //O(1)
    {
    	int					ret = 0;
    	void *				item = NULL;
    	TLinkQueueNode *	node = NULL;
    	node = (TLinkQueueNode *)LinkList_Get(queue, 0);
    	if (node == NULL)
    	{
    		return NULL;
    	}
    	item = node->item;
    	return item;
    }
    
    int LinkQueue_Length(LinkQueue* queue)
    {
    	return LinkList_Length(queue);
    }
    

    (test)

    #include "stdio.h"
    #include "string.h"
    #include "stdlib.h"
    
    #include "linkqueue.h"
    
    void main(void)
    {
    	int i , a[10];
    	LinkQueue* queue = NULL;
    
    	queue = LinkQueue_Create();
    
    	//向队列中添加元素
    	for (i=0; i<10; i++)
    	{
    		a[i] = i + 1;
    		LinkQueue_Append(queue, &a[i]);
    	}
    
    	//
    	printf("the length of queue: %d 
    ", LinkQueue_Length(queue));
    	printf("the header of queue: %d 
    ", *((int *)LinkQueue_Header(queue)));
    
    	while (LinkQueue_Length(queue) > 0)
    	{
    		printf("%d 
    ", *((int *)LinkQueue_Retrieve(queue)));
    	}
    
    	LinkQueue_Destroy(queue);
    
    	system("pause");
    }
    
  • 相关阅读:
    14、Cahin of Responsibility 责任链 COR设计模式
    13、Visitor 访问者模式 访问数据结构并处理数据 行为型设计模式
    HTML inline 与block元素
    javascript 继承实现
    深入理解linux的权限设置和SUID,SGID以及粘滞位
    设置express ejs模板的后缀名html
    Centos 安装编译codeblocks&&codelite
    JavaScript中两种类型的全局对象/函数【转】
    Canvas vs. SVG[转]
    centos 学习总结
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664706.html
Copyright © 2011-2022 走看看