• 数据结构-线性表-队列


    队列的特别实现(两个栈模拟队列)

    组合使用两个栈的后进先出可以实现队列的先进先出,简单高效,入队和出队的时间复杂度可以到 O(1)

    SQueue.h

    #ifndef _SQUEUE_H_
    #define _SQUEUE_H_
    
    typedef void SQueue;
    
    SQueue* SQueue_Create();
    
    void SQueue_Destroy(SQueue* queue);
    
    void SQueue_Clear(SQueue* queue);
    
    int SQueue_Append(SQueue* queue, void* item);
    
    void* SQueue_Retrieve(SQueue* queue);
    
    void* SQueue_Header(SQueue* queue);
    
    int SQueue_Length(SQueue* queue);
    
    #endif

    SQueue.c

    #include <stdio.h>
    #include <malloc.h>
    #include "LinkStack.h"
    #include "SQueue.h"
    
    typedef struct _tag_SQueue
    {
        LinkStack* inStack;
        LinkStack* outStack;
    } TSQueue;
    
    SQueue* SQueue_Create() // O(1)
    {
        TSQueue* ret = (TSQueue*)malloc(sizeof(TSQueue));
        
        if( ret != NULL )
        {
            ret->inStack = LinkStack_Create();
            ret->outStack = LinkStack_Create();
            
            if( (ret->inStack == NULL) || (ret->outStack == NULL) )
            {
                LinkStack_Destroy(ret->inStack);
                LinkStack_Destroy(ret->outStack);
                
                free(ret);
                
                ret = NULL;
            }
        }
        
        return ret;
    }
    
    void SQueue_Destroy(SQueue* queue) // O(n)
    {
        SQueue_Clear(queue);
        free(queue);
    }
    
    void SQueue_Clear(SQueue* queue) // O(n)
    {
        TSQueue* sQueue = (TSQueue*)queue;
        
        if( sQueue != NULL )
        {
            LinkStack_Clear(sQueue->inStack);
            LinkStack_Clear(sQueue->outStack);
        }
    }
    
    int SQueue_Append(SQueue* queue, void* item) // O(1)
    {
        TSQueue* sQueue = (TSQueue*)queue;
        
        if( sQueue != NULL )
        {
            LinkStack_Push(sQueue->inStack, item);
        }
    }
    
    void* SQueue_Retrieve(SQueue* queue) // O(1)
    {
        TSQueue* sQueue = (TSQueue*)queue;
        void* ret = NULL;
        
        if( sQueue != NULL )
        {
            if( LinkStack_Size(sQueue->outStack) == 0 )
            {
                while( LinkStack_Size(sQueue->inStack) > 0 )
                {
                    LinkStack_Push(sQueue->outStack, LinkStack_Pop(sQueue->inStack));
                }
            }
            
            ret = LinkStack_Pop(sQueue->outStack);
        }
        
        return ret;
    }
    
    void* SQueue_Header(SQueue* queue) // O(1)
    {
        TSQueue* sQueue = (TSQueue*)queue;
        void* ret = NULL;
        
        if( sQueue != NULL )
        {
            if( LinkStack_Size(sQueue->outStack) == 0 )
            {
                while( LinkStack_Size(sQueue->inStack) > 0 )
                {
                    LinkStack_Push(sQueue->outStack, LinkStack_Pop(sQueue->inStack));
                }
            }
            
            ret = LinkStack_Top(sQueue->outStack);
        }
        
        return ret;
    }
    
    int SQueue_Length(SQueue* queue) // O(1)
    {
        TSQueue* sQueue = (TSQueue*)queue;
        int ret = -1;
        
        if( sQueue != NULL )
        {
            ret = LinkStack_Size(sQueue->inStack) + LinkStack_Size(sQueue->outStack);
        }
        
        return ret;
    }

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include "SQueue.h"
    
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    
    int main(int argc, char *argv[]) 
    {
        SQueue* queue = SQueue_Create();
        int a[10] = {0};
        int i = 0;
        
        for(i=0; i<10; i++)
        {
            a[i] = i + 1;
            
            SQueue_Append(queue, a + i);
        }
        
        printf("Header: %d
    ", *(int*)SQueue_Header(queue));
        printf("Length: %d
    ", SQueue_Length(queue));
        
        for(i=0; i<5; i++)
        {
            printf("Retrieve: %d
    ", *(int*)SQueue_Retrieve(queue));
        }
        
        printf("Header: %d
    ", *(int*)SQueue_Header(queue));
        printf("Length: %d
    ", SQueue_Length(queue));
        
        for(i=0; i<10; i++)
        {
            a[i] = i + 1;
            
            SQueue_Append(queue, a + i);
        }
        
        while( SQueue_Length(queue) > 0 )
        {
            printf("Retrieve: %d
    ", *(int*)SQueue_Retrieve(queue));
        }
        
        SQueue_Destroy(queue);
        
        return 0;
    }

    假定有这样一个拥有3个操作的队列:
    1. EnQueue(v): 将v加入队列中
    2. DeQueue(): 使队列中的队首元素删除并返回此元素
    3. MaxElement(): 返回队列中的最大值
    请设计一种数据结构和算法,让MaxElement()操作的时间复杂度尽可能的低。

    http://blog.csdn.net/caryaliu/article/details/8097209

  • 相关阅读:
    Common Lisp 参数传递的几种形式
    EF架构~基于EF数据层的实现
    标准架构~业务层到底是否应该关注数据持久化的方式
    Redis学习笔记~Redis主从服务器,读写分离
    Redis学习笔记~是时候为Redis实现一个仓储了,RedisRepository来了
    MVVM架构~knockoutjs系列之数组的$index和$data
    【Oracle】-【sqlplus / as sysdba登录报错问题】-新用户使用sqlplus / as sysdba登录报错
    Android---App Widget(一)
    Mit 分布式系统导论,Distributed Systems ,lab1 -lab6 总结,实验一到实验六总结
    GDAL切割重采样遥感图像
  • 原文地址:https://www.cnblogs.com/siqi/p/4869440.html
Copyright © 2020-2023  润新知