您的位置:首页 > 理论基础 > 数据结构算法

数据结构(队列--两个栈实现)

2017-05-30 14:50 501 查看
 

单纯的用线性表或者单链表实现队列已经不足为奇,现在给大家介绍个有特色的,用两个栈实现队列。

 如图

   


这里介绍队列的常用操作:

l 创建队列

l 销毁队列

l 清空队列

l 入队

l 出队

l 返回队首元素

l 返回队的大小

代码总分为三个文件:

SQueue.h : 放置功能函数的声明,以及表的声明 

SQueue.c : 放置功能函数的定义,以及表的定义

Main.c     : 主函数,使用功能函数完成各种需求,一般用作测试

整体结构图为:



这里详细说下入队操作,出队操作和返回队首元素操作:

 

入队操作:

如图:

  


出队操作:

如图:

 


返回队首元素:

如图:

         


OK! 上代码:

SQueue.h :

 

[cpp] view
plain copy

#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 : 

[cpp] view
plain copy

#include <stdio.h>  

#include <malloc.h>  

#include "LinkStack.h"  

#include "SQueue.h"  

  

typedef struct _tag_SQueue  

{  

    LinkStack* inStack;  

    LinkStack* outStack;  

}TSQueue;  

  

SQueue* SQueue_Create()  

{  

    TSQueue* ret = (TSQueue*)malloc(sizeof(TSQueue));  

      

    if(NULL != ret)  

    {  

        ret->inStack  = LinkStack_Create();  

        ret->outStack = LinkStack_Create();  

          

        if((NULL == ret->inStack) || (NULL == ret->outStack))  

        {  

            LinkStack_Destroy(ret->inStack);  

            LinkStack_Destroy(ret->outStack);  

              

            free(ret);  

            ret = NULL;  

        }  

    }  

      

    return ret;  

}  

  

void SQueue_Destroy(SQueue* queue)  

{  

    SQueue_Clear(queue);  

      

    free(queue);  

}  

  

void SQueue_Clear(SQueue* queue)  

{  

    TSQueue* sQueue = (TSQueue*)queue;  

      

    if(NULL != sQueue)  

    {  

        LinkStack_Clear(sQueue->inStack);  

        LinkStack_Clear(sQueue->outStack);  

    }  

}  

  

int SQueue_Append(SQueue* queue, void* item)  

{  

    TSQueue* sQueue = (TSQueue*)queue;  

      

    int ret = 0;  

      

    if(NULL != sQueue)  

    {  

        ret = LinkStack_Push(sQueue->inStack, item);  

    }  

      

    return ret;  

}  

  

void* SQueue_Retrieve(SQueue* queue)  

{  

    TSQueue* sQueue = (TSQueue*)queue;  

      

    void* ret = NULL;  

      

    if(NULL != sQueue)  

    {  

        if(0 == LinkStack_Size(sQueue->outStack))  

        {  

            while(0 < LinkStack_Size(sQueue->inStack))  

            {  

                LinkStack_Push(sQueue->outStack, LinkStack_Pop(sQueue->inStack));  

            }  

        }  

          

        ret = LinkStack_Pop(sQueue->outStack);  

    }  

      

    return ret;  

}  

  

void* SQueue_Header(SQueue* queue)  

{  

    TSQueue* sQueue = (TSQueue*)queue;  

      

    void* ret = NULL;  

      

    if((NULL != sQueue) && (0 < SQueue_Length(queue)))  

    {  

        if(0 == LinkStack_Size(sQueue->outStack))  

        {  

            while(0 < LinkStack_Size(sQueue->inStack))  

            {  

                LinkStack_Push(sQueue->outStack, LinkStack_Pop(sQueue->inStack));  

            }         

        }  

          

        ret = LinkStack_Top(sQueue->outStack);  

    }  

      

    return ret;  

}  

  

int SQueue_Length(SQueue* queue)  

{  

    TSQueue* sQueue = (TSQueue*)queue;  

      

    int ret = -1;  

      

    if(NULL != sQueue)  

    {  

        ret = LinkStack_Size(sQueue->inStack) +   

              LinkStack_Size(sQueue->outStack);  

    }  

      

    return ret;  

}  

 

Main.c     :

[cpp] view
plain copy

#include <stdio.h>  

#include <stdlib.h>  

#include "SQueue.h"  

  

int main(void)  

{  

    SQueue* queue = SQueue_Create();  

      

    int a[10];  

    int i = 0;  

      

    for(i=0; i<10; i++)  

    {  

        a[i] = i+1;  

          

        SQueue_Append(queue, a+i);  

    }  

    printf("Length:  %d\n", SQueue_Length(queue));  

    printf("Header:  %d\n", *(int*)SQueue_Header(queue));  

  

      

    for(i=0; i<5; i++)  

    {  

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

    }  

      

    printf("Header:  %d\n", *(int*)SQueue_Header(queue));  

    printf("Length:  %d\n", 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\n", *(int*)SQueue_Retrieve(queue));  

    }  

      

    SQueue_Destroy(queue);  

  

    return 0;  

}  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: