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

  • 相关阅读:
    报错:无法截断表 '某表',因为该表正由 FOREIGN KEY 约束引用
    如何选择使用结构或类
    C#交换两个变量值的多种写法
    什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
    把数据库中有关枚举项值的数字字符串转换成文字字符串
    为参数类型一样返回类型不同的接口写一个泛型方法
    报错:System.NotSupportedException: LINQ to Entities does not recognize the method
    关于泛型类和扩展方法的一点思考
    在ASP.NET MVC下通过短信验证码注册
    ASP.NET MVC下实现前端视图页的Session
  • 原文地址:https://www.cnblogs.com/wxb20/p/6144837.html
Copyright © 2011-2022 走看看