数据结构封装之《SeqQueue2.0改进顺序式队列》

说明:

  1. 本队列是对SeqQueue的改进实现;有关SeqQueue1.0,请转到: 数据结构封装之 《SeqQueue顺序式队列》

  2. 本顺序式队列,在原有的基础上,增加了两个标志位front和rear,分别代表队列“头”和队列“尾”在顺序表中的下标。

  3. 相比于上个版本的优点(其实也只有1个): 规避了删除队列头时,产生队列元素移动的操作。其机制是通过front和rear作为头和尾的下标,队列的进出,实质上就是下标的移动,模拟了循环队列的方式,从而避免了对顺序表内元素的移动。

  4. 相比于LinkQueue2.0,缺点是,队列限制了长度。

下面将给出该数据结构的代码,每个函数的结构分析 ,以及个别主要函数的汇编分析


代码:

SeqQueue.h

#ifndef _SEQQUEUE_H_
#define _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

SeqQueue.c

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

typedef unsigned int TSeqQueueNode;

typedef struct _tag_SeqQueue
{
    int capacity;
    int length;
    int front;
    int rear;
    TSeqQueueNode* node;
} TSeqQueue;

SeqQueue* SeqQueue_Create(int capacity) // O(1)
{
    TSeqQueue* ret = NULL;

    if( capacity >= 0 )
    {
        ret = (TSeqQueue*)malloc(sizeof(TSeqQueue) + sizeof(TSeqQueueNode) * capacity);
    }

    if( ret != NULL )
    {
        ret->capacity = capacity;
        ret->length = 0;
        ret->front = 0;
        ret->rear = 0;
        ret->node = (TSeqQueueNode*)(ret + 1);
    }

    return ret;
}

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

void SeqQueue_Clear(SeqQueue* queue) // O(1)
{
    TSeqQueue* sQueue = (TSeqQueue*)queue;

    if( sQueue != NULL )
    {
        sQueue->length = 0;
        sQueue->front = 0;
        sQueue->rear = 0;
    }
}

int SeqQueue_Append(SeqQueue* queue, void* item) // O(1)
{
    TSeqQueue* sQueue = (TSeqQueue*)queue;
    int ret = (sQueue != NULL) && (item != NULL);

    ret = ret && (sQueue->length + 1 <= sQueue->capacity);

    if( ret )
    {
        sQueue->node[sQueue->rear] = (TSeqQueueNode)item;

        sQueue->rear = (sQueue->rear + 1) % sQueue->capacity;

        sQueue->length++;
    }

    return ret;
}

void* SeqQueue_Retrieve(SeqQueue* queue) // O(1)
{
    TSeqQueue* sQueue = (TSeqQueue*)queue;
    void* ret = SeqQueue_Header(queue);

    if( ret != NULL )
    {
        sQueue->front = (sQueue->front + 1) % sQueue->capacity;

        sQueue->length--;
    }

    return ret;
}

void* SeqQueue_Header(SeqQueue* queue) // O(1) 
{
    TSeqQueue* sQueue = (TSeqQueue*)queue;
    void* ret = NULL;

    if( (sQueue != NULL) && (sQueue->length > 0) )
    {
        ret = (void*)(sQueue->node[sQueue->front]);
    }

    return ret;
}

int SeqQueue_Length(SeqQueue* queue) // O(1)
{
    TSeqQueue* sQueue = (TSeqQueue*)queue;
    int ret = -1;

    if( sQueue != NULL )
    {
        ret = sQueue->length;
    }

    return ret;
}

int SeqQueue_Capacity(SeqQueue* queue) // O(1)
{
    TSeqQueue* sQueue = (TSeqQueue*)queue;
    int ret = -1;

    if( sQueue != NULL )
    {
        ret = sQueue->capacity;
    }

    return ret;
}

main.c

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


int main(int argc, char *argv[]) 
{
    SeqQueue* queue = SeqQueue_Create(6);
    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));
    }

    printf("\n");

    for(i=0; i<10; i++)
    {
        a[i] = i + 1;

        SeqQueue_Append(queue, a + i);

        printf("Retrieve: %d\n", *(int*)SeqQueue_Retrieve(queue));
    }

    SeqQueue_Destroy(queue);

    return 0;
}

函数结构分析:

1.SeqQueue_Create

2.SeqQueue_Destroy

3.SeqQueue_Clear

4.SeqQueue_Append

5.SeqQueue_Retrieve

6.SeqQueue_Header

7.SeqQueue_Length

8.SeqQueue_Capacity


汇编分析:

main

1.SeqQueue_Create

2.SeqQueue_Destroy

4.SeqQueue_Append

5.SeqQueue_Retrieve

6.SeqQueue_Header

7.SeqQueue_Length

8.SeqQueue_Capacity

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值