分享:泛型队列
最近一点做题看书的心情的都没有。数据结构停在了二叉树,看来会停很久。
所以……今天有时间完成了一个月以前就该完成的事,拿出来分享给大家。
虽然完全不知道大家是否对此感兴趣。
程序代码:
//测试:
#include "queue.h"
#include <stdio.h>
MakeQueue( int, _int )
MakeQueue( char, _char )
int
main( void )
{
int ix;
Create_int();
Create_char();
for( ix = 0; 20 > ix; ++ix )
{
Insert_int( ix );
Insert_char( 'a' + ix );
}
printf( "队列1:\n" );
while( !Is_Empty_int() )
{
printf( "%d ",First_int() );
Delete_int();
}
printf( "\n队列2:\n" );
while( !Is_Empty_char() )
{
printf( "%c ",First_char() );
Delete_char();
}
Destroy_int();
Destroy_char();
return 0;
}
程序代码:
//泛型队列:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define INITSIZE 128
#define MakeQueue( ElementType, Name ) \
void Insert##Name( ElementType Value ); \
ElementType First##Name( void ); \
void Delete##Name( void ); \
int Is_Full##Name( void ); \
int Is_Empty##Name( void ); \
void Destroy##Name( void ); \
void Create##Name( void ); \
\
static ElementType *Queue##Name; \
static int CurrentSize##Name = INITSIZE; \
static int Frnot##Name = 1; \
static int Read##Name = 0; \
\
\
void Insert##Name( ElementType Value ) \
{ \
assert( !Is_Full##Name() ); \
assert( NULL != Queue##Name ); \
Read##Name = ( Read##Name + 1 ) % CurrentSize##Name; \
Queue##Name[ Read##Name ] = Value; \
} \
\
\
ElementType First##Name( void ) \
{ \
assert( !Is_Empty##Name()); \
assert( NULL != Queue##Name ); \
return Queue##Name[ Frnot##Name ]; \
} \
\
\
void Delete##Name( void ) \
{ \
assert( !Is_Empty##Name() ); \
assert( NULL != Queue##Name ); \
Frnot##Name = ( Frnot##Name + 1 ) % CurrentSize##Name; \
} \
\
int Is_Full##Name( void ) \
{ \
int i; \
ElementType *Temp; \
\
assert( NULL != Queue##Name ); \
i = ( Read##Name + 2 ) % CurrentSize##Name; \
\
if( i == Frnot##Name ) \
{ \
CurrentSize##Name += INITSIZE; \
Temp = ( ElementType * )realloc( Queue##Name, CurrentSize##Name * sizeof( ElementType ) ); \
if( NULL == Temp ) \
{ \
CurrentSize##Name -= INITSIZE; \
return 1; \
} \
Queue##Name = Temp; \
return 0; \
} \
\
return 0; \
} \
\
\
int Is_Empty##Name( void ) \
{ \
return ( Read##Name + 1 ) % CurrentSize##Name == Frnot##Name; \
} \
\
\
void Create##Name( void ) \
{ \
assert( NULL == Queue##Name ); \
if( NULL == ( Queue##Name = ( ElementType * )malloc( CurrentSize##Name * sizeof( ElementType ) ) ) ) \
exit( EXIT_FAILURE ); \
} \
\
\
void Destroy##Name( void ) \
{ \
assert( NULL != Queue##Name ); \
free( Queue##Name ); \
Queue##Name = NULL; \
CurrentSize##Name = INITSIZE; \
Frnot##Name = 1; \
Read##Name = 0; \
}
[此贴子已经被作者于2017-4-22 10:25编辑过]








楼主能否用白话科普一下什么是泛型队列,还有,希望解释一下##是什么语法现象,有何用途。谢谢


多谢楼主分享~这个要顶
~~~~~
~~楼主加油啊~挺你