数据结构之顺序队列

原创 2013年12月02日 15:29:11
队列是一种特殊的线性表
队列仅在线性表的两端进行操作
队头(Front):取出数据元素的一端
队尾(Rear):插入数据元素的一端

队列不允许在中间部位进行操作!

1、顺序队列
 (1)顺序队列的定义
   队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。

(2) 顺序队列的表示

  ①和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素。
  ②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0。

队列的一些常用操作
创建队列
销毁队列
清空队列
进队列
出队列
获取队头元素
获取队列的长度


typedef void SeqList;
typedef void SeqListNode;

#include <stdio.h>
#include <malloc.h>
#include "SeqList.h"

typedef unsigned int TSeqListNode;

typedef struct _tag_SeqList
{
    int capacity;
    int length;
    TSeqListNode* node;
} TSeqList;
//创建队列 
SeqList* SeqList_Create(int capacity) // O(1)
{
    TSeqList* ret = NULL;
    
    if( capacity >= 0 )
    {
        ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);
    }
    
    if( ret != NULL )
    {
        ret->capacity = capacity;
        ret->length = 0;
        ret->node = (TSeqListNode*)(ret + 1);
    }
    
    return ret;
}
//销毁队列 
void SeqList_Destroy(SeqList* list) // O(1)
{
    free(list);
}

void SeqList_Clear(SeqList* list) // O(1)
{
    TSeqList* sList = (TSeqList*)list;
    
    if( sList != NULL )
    {
        sList->length = 0;
    }
}
//获取长度 
int SeqList_Length(SeqList* list) // O(1)
{
    TSeqList* sList = (TSeqList*)list;
    int ret = -1;
    
    if( sList != NULL )
    {
        ret = sList->length;
    }
    
    return ret;
}
//获取容量 
int SeqList_Capacity(SeqList* list) // O(1)
{
    TSeqList* sList = (TSeqList*)list;
    int ret = -1;
    
    if( sList != NULL )
    {
        ret = sList->capacity;
    }
    
    return ret;
}
//插入元素 
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) // O(n) 
{
    TSeqList* sList = (TSeqList*)list;
    int ret = (sList != NULL);
    int i = 0;
    
    ret = ret && (sList->length + 1 <= sList->capacity);
    ret = ret && (0 <= pos);
    
    if( ret )
    {
        if( pos >= sList->length )
        {
            pos = sList->length;
        }
        
        for(i=sList->length; i>pos; i--)
        {
            sList->node[i] = sList->node[i-1];
        }
        
        sList->node[i] = (TSeqListNode)node;
        
        sList->length++;
    }
    
    return ret;
}

SeqListNode* SeqList_Get(SeqList* list, int pos) // O(1) 
{
    TSeqList* sList = (TSeqList*)list;
    SeqListNode* ret = NULL;
    
    if( (sList != NULL) && (0 <= pos) && (pos <= sList->length) )
    {
        ret = (SeqListNode*)(sList->node[pos]);
    }
    
    return ret;
}
//获取某个位置上的元素 
SeqListNode* SeqList_Delete(SeqList* list, int pos) // O(n)
{
    TSeqList* sList = (TSeqList*)list;
    SeqListNode* ret = SeqList_Get(list, pos);
    int i = 0;
    
    if( ret != NULL )
    {
        for(i=pos+1; i<sList->length; i++)
        {
            sList->node[i-1] = sList->node[i];
        }
        
        sList->length--;
    }
    
    return ret;
}

然后对函数封装:

#include "SeqList.h"
#include "SeqQueue.h"

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

void SeqQueue_Destroy(SeqQueue* queue) // O(1)
{
    SeqList_Destroy(queue);
}

void SeqQueue_Clear(SeqQueue* queue) // O(1)
{
    SeqList_Clear(queue);
}

int SeqQueue_Append(SeqQueue* queue, void* item) // O(1)
{
    return SeqList_Insert(queue, item, SeqList_Length(queue));
}

void* SeqQueue_Retrieve(SeqQueue* queue) // O(n)
{
    return SeqList_Delete(queue, 0);
}

void* SeqQueue_Header(SeqQueue* queue) // O(1) 
{
    return SeqList_Get(queue, 0);
}

int SeqQueue_Length(SeqQueue* queue) // O(1)
{
    return SeqList_Length(queue);
}

int SeqQueue_Capacity(SeqQueue* queue) // O(1)
{
    return SeqList_Capacity(queue);
}

测试代码:

#include <stdio.h>
#include <stdlib.h>
#include "SeqQueue.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) 
{
    SeqQueue* queue = SeqQueue_Create(20);
    int a[10] = {0};
    int i = 0;
    
    for(i=0; i<10; i++)
    {
        a[i] = i + 1;
        
        SeqQueue_Append(queue, a + i);
    }
    
    printf("Header: %d\n", *(int*)SeqQueue_Header(queue));
    printf("Length: %d\n", SeqQueue_Length(queue));
    printf("Capacity: %d\n", SeqQueue_Capacity(queue));
    
    while( SeqQueue_Length(queue) > 0 )
    {
        printf("Retrieve: %d\n", *(int*)SeqQueue_Retrieve(queue));
    }
    
    SeqQueue_Destroy(queue);
    system("pause");
	return 0;
	
}




数据结构-队列-顺序存储完整可执行代码

数据结构-队列-顺序存储完整可执行代码 #include #include #include #define OK 1 #define ERROR 0 #define T...
  • hitwhylz
  • hitwhylz
  • 2013年11月04日 10:58
  • 3151

C语言数据结构-顺序队列

顺序队列顺序队列与顺序表相似,只不过其具有队列的运算规则。数据只能从队尾进,对头出,为先进先出方式。 分别用两个数来表示队头front和队尾rear的位置,其只能向前增加,不能退后,这样容易溢出且浪...
  • ahafg
  • ahafg
  • 2015年10月11日 11:59
  • 1420

数据结构-循环顺序队(C语言)

循环队列中,空队、满队判决条件(head==tail)出现二义性。 以下代码采用人为浪费一个单元方式解决二义性问题。 空队特征:head=tail 满队特征:head=(tail+1)%QueueMa...
  • Yeziquanquan
  • Yeziquanquan
  • 2016年09月11日 01:17
  • 707

JAVA数据结构之循环队列的实现

1、循环队列CircleQueue类的实现代码如下所示: public class CircleQueue { private Object[] array; private int capac...
  • dianzigaoshou
  • dianzigaoshou
  • 2017年07月07日 11:18
  • 163

队列的实现-顺序队列和链队列

本文主要给出我对队列的实现,包括顺序队列和链队列。顺序队列(循环队列)基本概念顺序队列 顺序队列是用数组存放队列元素,同时设置队头和对尾指针来控制元素的出队和入队。约定: 队头指针...
  • Kang_TJU
  • Kang_TJU
  • 2017年03月20日 14:06
  • 399

数据结构队列C++实现 链式和循环

#include #include #include using namespace std; namespace my_space { template class queue...
  • a363344923
  • a363344923
  • 2014年12月07日 15:34
  • 1696

数据结构:队列的顺序存储结构(循环队列)

队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。是一种先进先出的线性表(FIFO)。允许插入的一端称为队尾,允许删除的一端称为队头。我们在《栈的顺序存储结构》中发现,栈操...
  • Sandeldeng
  • Sandeldeng
  • 2016年11月01日 21:14
  • 991

【数据结构与算法】基本数据结构——队列的顺序表示

以下为操作队列的算法,该队列为静态队列,用循环数组实现。 给该队列分配的内存长度为len+1,但实际只用了len个内存空间来保存数据,这样做是为了更方便判断队列的满与空。队列中front位置中存放的是...
  • mmc_maodun
  • mmc_maodun
  • 2013年09月07日 23:09
  • 2888

Java基础 - 队列的顺序存储结构及实现

队列(Queue)另外一种被限制的线性表,它使用固定的一端来插入数据,另一端只用于删除元素。...
  • ApatheCrazyFan
  • ApatheCrazyFan
  • 2016年11月08日 15:22
  • 450

数据结构 --静态队列 讲解

上次我在 http://blog.csdn.net/nvd11/article/details/8805772 已经解释了链式队列的大概结构和c语言代码实现. 也提到了另一种队列: 静态...
  • nvd11
  • nvd11
  • 2013年04月19日 02:16
  • 1224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构之顺序队列
举报原因:
原因补充:

(最多只允许输入30个字)