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


     

           当看到用两个栈实现队列以后,大家有没有兴趣用两个队列实现一个栈呢,呵呵!现在就来介绍用两个队列实现一个栈。

          

           如图

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

    l 创建栈

    l 销毁栈

    l 清空栈

    l 压栈

    l 出栈

    l 返回栈顶元素

    l 返回栈的大小

    代码总分为三个文件:

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

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

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

    整体结构图为:

     

    这里详细说下压栈操作,出栈操作和返回栈顶元素操作:

     

    压栈操作:

    int QStack_Push(QStack* stack, void* item)
    {
    	TQStack* aStack = (TQStack*)stack;
    	
    	int ret = (NULL!=aStack) && (NULL!=item);
    	
    	if(ret)
    	{
    		if(0 == LinkQueue_Length(aStack->queue_A))
    		{
    			ret = LinkQueue_Append(aStack->queue_B, item);	
    		}
    		else
    		{
    			ret = LinkQueue_Append(aStack->queue_A, item);
    		}
    		
    	}
    	
    	return ret;
    }


    如图:

      

    出栈操作:

    void* QStack_Pop(QStack* stack)
    {
    	TQStack* aStack = (TQStack*)stack;
    	
    	void* ret = NULL;
    	
    	if((NULL!=aStack) && (0<QStack_Length(aStack)))
    	{
    		if(0 == LinkQueue_Length(aStack->queue_B))
    		{
    			while(LinkQueue_Length(aStack->queue_A) > 1)
    			{
    				LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
    			}
    			
    			ret = LinkQueue_Retrieve(aStack->queue_A);
    		}
    		else 
    		{
    			while(LinkQueue_Length(aStack->queue_B) > 1)
    			{
    				LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
    			}
    			
    			ret = LinkQueue_Retrieve(aStack->queue_B);
    		}
    	}
    	
    	return ret;
    }


    如图:

    返回栈顶元素:

    void* QStack_Top(QStack* stack)
    {
    	TQStack* aStack = (TQStack*)stack;
    	
    	void* ret = NULL;
    	
    	if((NULL!=aStack) && (0<QStack_Length(stack)))
    	{
    		if(0 == LinkQueue_Length(aStack->queue_B))
    		{
    			while(LinkQueue_Length(aStack->queue_A) > 1)
    			{
    				LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
    			}
    			
    			ret = LinkQueue_Header(aStack->queue_A);
    			LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
    		}
    		else
    		{
    			while(LinkQueue_Length(aStack->queue_B) > 1)
    			{
    				LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
    			}
    			
    			ret = LinkQueue_Header(aStack->queue_B);
    			LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
    		}
    	}
    	
    	return ret;
    }


    如图:

               

    OK! 上代码:

    QStack.h : 

    #ifndef _QSTACK_H_
    #define _QSTACK_H_
    
    typedef void QStack;
    
    QStack* QStack_Create();
    
    void QStack_Destroy(QStack* stack);
    
    void QStack_Clear(QStack* stack);
    
    int QStack_Push(QStack* stack, void* item);
    
    void* QStack_Pop(QStack* stack);
    
    void* QStack_Top(QStack* stack);
    
    int QStack_Length(QStack* stack);
    
    #endif
    


     

    QStack.c :

    #include <malloc.h>
    #include "LinkQueue.h"
    #include "QStack.h"
    
    typedef struct _tag_QStack
    {
    	LinkQueue* queue_A;
    	LinkQueue* queue_B;
    }TQStack;
    
    QStack* QStack_Create()
    {
    	TQStack* ret = (TQStack*)malloc(sizeof(TQStack));
    	
    	if(NULL != ret)
    	{
    		ret->queue_A = LinkQueue_Create();
    		ret->queue_B = LinkQueue_Create();
    		
    		if((NULL==ret->queue_A) || (NULL==ret->queue_B))
    		{
    			LinkQueue_Destroy(ret->queue_A);
    			LinkQueue_Destroy(ret->queue_B);
    			
    			free(ret);
    			ret = NULL;
    		}
    	}
    	
    	return ret;
    }
    
    void QStack_Destroy(QStack* stack)
    {
    	QStack_Clear(stack);
    	
    	free(stack);	
    }
    
    void QStack_Clear(QStack* stack)
    {
    	while(QStack_Length(stack) > 0)
    	{
    		QStack_Pop(stack);
    	}
    }
    
    int QStack_Push(QStack* stack, void* item)
    {
    	TQStack* aStack = (TQStack*)stack;
    	
    	int ret = (NULL!=aStack) && (NULL!=item);
    	
    	if(ret)
    	{
    		if(0 == LinkQueue_Length(aStack->queue_A))
    		{
    			ret = LinkQueue_Append(aStack->queue_B, item);	
    		}
    		else
    		{
    			ret = LinkQueue_Append(aStack->queue_A, item);
    		}
    		
    	}
    	
    	return ret;
    }
    
    void* QStack_Pop(QStack* stack)
    {
    	TQStack* aStack = (TQStack*)stack;
    	
    	void* ret = NULL;
    	
    	if((NULL!=aStack) && (0<QStack_Length(aStack)))
    	{
    		if(0 == LinkQueue_Length(aStack->queue_B))
    		{
    			while(LinkQueue_Length(aStack->queue_A) > 1)
    			{
    				LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
    			}
    			
    			ret = LinkQueue_Retrieve(aStack->queue_A);
    		}
    		else 
    		{
    			while(LinkQueue_Length(aStack->queue_B) > 1)
    			{
    				LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
    			}
    			
    			ret = LinkQueue_Retrieve(aStack->queue_B);
    		}
    	}
    	
    	return ret;
    }
    
    void* QStack_Top(QStack* stack)
    {
    	TQStack* aStack = (TQStack*)stack;
    	
    	void* ret = NULL;
    	
    	if((NULL!=aStack) && (0<QStack_Length(stack)))
    	{
    		if(0 == LinkQueue_Length(aStack->queue_B))
    		{
    			while(LinkQueue_Length(aStack->queue_A) > 1)
    			{
    				LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
    			}
    			
    			ret = LinkQueue_Header(aStack->queue_A);
    			LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
    		}
    		else
    		{
    			while(LinkQueue_Length(aStack->queue_B) > 1)
    			{
    				LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
    			}
    			
    			ret = LinkQueue_Header(aStack->queue_B);
    			LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
    		}
    	}
    	
    	return ret;
    }
    
    int QStack_Length(QStack* stack)
    {
    	TQStack* aStack = (TQStack*)stack;
    	
    	int ret = -1;
    	
    	if(NULL != aStack)
    	{
    		ret = LinkQueue_Length(aStack->queue_B) +
    			  LinkQueue_Length(aStack->queue_A);
    	}
    	
    	return ret;
    }
    


     

    Main.c     :

                

    #include <stdio.h>
    #include "QStack.h"
    
    int main(void)
    {
    	QStack* stack = QStack_Create();
    	
    	int a[10];
    	int i = 0;
    
    	for(i=0; i<10; i++)
    	{
    		a[i] = i;
    		
    		QStack_Push(stack, a+i);
    	}
    	
    	printf("Header:   %d
    ", *(int*)QStack_Top(stack));
    	printf("Length:   %d
    
    ", QStack_Length(stack));
    	
    	while(QStack_Length(stack) > 0)
    	{
    		printf("Pop:  %d
    ", *(int*)QStack_Pop(stack));
    	}
    	printf("
    ");
    	
    	for(i=0; i<6; i++)
    	{
    		a[i] = i+10;
    		
    		QStack_Push(stack, a+i);
    	}
    	
    	while(QStack_Length(stack) > 0)
    	{
    		printf("Pop:  %d
    ", *(int*)QStack_Pop(stack));
    	}
    	
    	QStack_Destroy(stack);
    	
    	return 0;
    }


  • 相关阅读:
    研究下
    linux 下wireshark安装与使用
    Spring优秀工具类Resource
    sunOS常用命令
    常用网站
    linux sar指令
    spring+quartz详解
    linux setenv 用法
    转hashmap非线程安全的解决办法
    gdb 调试core
  • 原文地址:https://www.cnblogs.com/riskyer/p/3241362.html
Copyright © 2020-2023  润新知