利用两个栈实现的队列

当然要用到之前实现的单链表文件以及链式栈文件

头文件

#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

模块文件

#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(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)
{
	SQueue_Clear(queue);
	free(queue);
}

void SQueue_Clear(SQueue* queue)
{
	TSQueue* sQueue = (TSQueue*)queue;
	
	if(sQueue != NULL){
		LinkStack_Clear(sQueue->inStack); 
		LinkStack_Clear(sQueue->outStack); 
	}
}

int SQueue_Append(SQueue* queue,void* item)
{
	TSQueue* sQueue = (TSQueue*)queue;
	int ret = 0;
	if(sQueue != NULL){
		ret = LinkStack_Push(sQueue->inStack,item);
	}	 
	return ret;
}

void* SQueue_Retrieve(SQueue* queue)
{
	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)
{
	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)
{
	TSQueue* sQueue = (TSQueue*)queue;
	int ret = -1;
	
	if(sQueue != NULL){
		ret = LinkStack_Size(sQueue->inStack) + LinkStack_Size(sQueue->outStack);
	}
	return ret;
}

测试文件

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


你可能感兴趣的:(利用两个栈实现的队列)