作者:woshishl | 来源:互联网 | 2023-05-19 04:44
说明:本队列对是通过堆栈来实现的,一个inStack,一个outStack,通过两个栈的转移,以实现队列的功能;通过复用LinkStack的方法封装的SQueue,请看:数
说明:
本队列对是通过堆栈来实现的,一个inStack,一个outStack,通过两个栈的转移,以实现队列的功能;
通过复用LinkStack的方法封装的SQueue,请看:数据结构封装之《LinkStack链栈》
下面将给出该数据结构的代码,每个函数的结构分析 ,以及个别主要函数的汇编分析
代码:
LinkQueue.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
LinkQueue.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( 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 = -1;
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;
}
main.c
#include
#include
#include "SQueue.h"
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;
}
函数结构分析:
1.LinkQueue_Create
2.LinkQueue_Destroy
3.LinkQueue_Clear
4.LinkQueue_Append
5.LinkQueue_Retrieve
6.LinkQueue_Header
7.LinkQueue_Length
汇编分析:
main
1.LinkQueue_Create
2.LinkQueue_Destroy
3.LinkQueue_Clear
4.LinkQueue_Append
5.LinkQueue_Retrieve
6.LinkQueue_Header
7.LinkQueue_Length