• 一步一步学数据结构之1--1(队列--两个栈实现)


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

     如图

      

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

    l 创建队列

    l 销毁队列

    l 清空队列

    l 入队

    l 出队

    l 返回队首元素

    l 返回队的大小

    代码总分为三个文件:

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

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

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

    整体结构图为:

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

    入队操作:

    如图:

      

    出队操作:

    如图:

     

    返回队首元素:

    如图:

             

    OK! 上代码:

    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()
    {
    	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     :

    #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
    ", SQueue_Length(queue));
    	printf("Header:  %d
    ", *(int*)SQueue_Header(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;
    }
    


     

  • 相关阅读:
    Oracle跟踪生成及Tkprof分析性能实战(附实战Demo)系列一
    sqlserver查看锁及解锁
    ETL利器Kettle实战应用解析系列二 【应用场景和实战DEMO下载】
    利用反射从程序集dll中动态调用方法(附demo下载)
    ETL利器Kettle实战应用解析系列三 【ETL后台进程执行配置方式】
    分享一款Web压力测试工具Pylot
    stark组件前戏之以上知识点整合应用示例
    rbac组件权限分配
    rbac组件权限分配之权限批量操作
    stark组件开发之自动生成URL
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3241197.html
Copyright © 2020-2023  润新知