zoukankan      html  css  js  c++  java
  • 数据结构-线性表-队列

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

    组合使用两个栈的后进先出可以实现队列的先进先出,简单高效,入队和出队的时间复杂度可以到 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

  • 相关阅读:
    3.学习SpringMVC注解深入
    1.Google Blockly概述以及入门
    4.Servlet的Response和Request
    3.Servlet的ServletContext对象
    提高网络点击率的八种方法
    JNDI知道这么多就够了!
    jetty源代码剖析
    cocos2d-x 源代码分析 : control 源代码分析 ( 控制类组件 controlButton)
    Codeforces Round #254 (Div. 2)B. DZY Loves Chemistry
    几款“理想”“习惯”应用体验报告
  • 原文地址:https://www.cnblogs.com/siqi/p/4869440.html
Copyright © 2011-2022 走看看