zoukankan      html  css  js  c++  java
  • 队列的优化顺序实现

    1.#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  main is used to test data */

    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 ", *(int*)SeqQueue_Header(queue));
        printf("Length: %d ", SeqQueue_Length(queue));
        printf("Capacity: %d ", SeqQueue_Capacity(queue));
        
        while( SeqQueue_Length(queue) > 0 )
        {
            printf("Retrieve: %d ", *(int*)SeqQueue_Retrieve(queue));
        }
        
        printf(" ");
        
        for(i=0; i<10; i++)
        {
            a[i] = i + 1;
            
            SeqQueue_Append(queue, a + i);

            printf("Retrieve: %d ", *(int*)SeqQueue_Retrieve(queue));
        }
        
        SeqQueue_Destroy(queue);
        
        return 0;
    }

    2.#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;
    }

    3.#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

  • 相关阅读:
    BZOJ2061 : Country
    BZOJ3591: 最长上升子序列
    BZOJ4356 : Ceoi2014 Wall
    BZOJ2159 : Crash 的文明世界
    BZOJ2149 : 拆迁队
    BZOJ2739 : 最远点
    BZOJ4068 : [Ctsc2015]app
    BZOJ4361 : isn
    BZOJ4404 : [Neerc2015]Binary vs Decimal
    BZOJ4402 : Claris的剑
  • 原文地址:https://www.cnblogs.com/wxb20/p/6144837.html
Copyright © 2011-2022 走看看