分享:通用栈(如果你有任何疑问或建议,请提出)
栈、队列、链表的通用,到此刻算是彻底完成了。三种ADT,三种不同的实现思路。
还是老样子,如果你有任何问题或建议,情提出。
21:02 5/18
修正了void *进行数学计算的问题,现在应该不会再报错了。
22:32 5/19
删除了实现文件中多余的宏。
DestroyStack()函数增加了几行代码,当最后一个栈被销毁,则释放掉全局变量STACK指向的空间。
但似乎这样做并不是很有必要,先就这样。
程序代码:
//测试: #include "Stack.h" #include <stdio.h> int main( void ) { Stack_T a, c; int *b; int ix; char ch; char *k; a = CreateStack( sizeof( int ) ); c = CreateStack( sizeof( char ) ); for( ix = 0; 200 > ix; ++ix ) { PoshStack( a, &ix ); ch = 'a' + ( ix % 26); PoshStack( c, &ch ); } while( !IsEmptyStack( a ) ) { b = TopStack( a ); printf( "%d ", *b ); PopStack( a ); } DestroyStack( a ); printf( "\n" ); while( !IsEmptyStack( c ) ) { k = TopStack( c ); printf( "%c ", *k ); PopStack( c ); } DestroyStack( c ); return 0; }
程序代码:
//接口: #ifndef __STACK_H__ #define __STACK_H__ #include <stdio.h> #define T Stack_T typedef int T; T CreateStack( size_t DataSize );//创建一个栈,参数为数据的大小,成功返回栈。 int DestroyStack( T Stack );//销毁一个栈,参数为需要销毁的栈,成功返回0,失败返回1 void PoshStack( T Stack, void *Value );//将一个值压入栈,参数为栈和需要入栈的元素。 void * TopStack( T Stack );//将一个值从栈顶弹出,参数为需要弹出值的栈,成功返回指向该元素的指针。 void PopStack( T Stack );//从一个栈中删除栈顶元素,参数为需要删除值的栈 int IsEmptyStack( T Stack );//检测栈是否为空,参数为需要检测的栈,如果为空,返回1,否则返回0 int IsFullStack( T Stack );//检测栈是否已满,参数为需要检测的栈,如果已满返回1,否则返回0 #undef T #endif
程序代码:
//实现 #include "Stack.h" #include <stdlib.h> #include <stdio.h> #include <string.h> #define T Stack_T #define L list #define INITSIZE 128 #define INITUP 10 typedef struct L *L; struct L{ void *Element; void *Top; int Step; int CurrentSize; }; static L *STACK; static int ThisSize; T CreateStack( size_t DataSize ) { int ix; L *Temp; if( NULL == STACK ) { ThisSize = INITUP; STACK = ( L * )malloc( ThisSize * sizeof( L ) ); if( NULL == STACK ) exit( EXIT_FAILURE ); for( ix = 0; ThisSize > ix; ++ix ) STACK[ ix ] = NULL; } for( ix = 0; ThisSize > ix && NULL != STACK[ ix ]; ++ix ) ; if( ThisSize == ix ) { ThisSize += INITUP; Temp = ( L * )realloc( STACK, ThisSize * sizeof( L ) ); if( NULL == Temp ) exit( EXIT_FAILURE ); STACK = Temp; for( int i = ix; ThisSize > i; ++i ) STACK[ i ] = NULL; } STACK[ ix ] = malloc( sizeof( struct L ) ); if( NULL == STACK[ ix ] ) exit( EXIT_FAILURE ); STACK[ ix ]->Element = malloc( INITSIZE * DataSize ); if( NULL == STACK[ ix ]->Element ) exit( EXIT_FAILURE ); STACK[ ix ]->Top = STACK[ ix ]->Element; STACK[ ix ]->Step = DataSize; STACK[ ix ]->CurrentSize = INITSIZE; return ix; } int DestroyStack( T Stack ) { int ix; if( 0 > Stack || ThisSize <= Stack || NULL == STACK[ Stack ] ) return 1; free( STACK[ Stack ]->Element ); free( STACK[ Stack ] ); STACK[ Stack ] = NULL; for( ix = 0; ThisSize > ix; ++ix ) if( NULL != STACK[ ix ] ) break; if( ThisSize == ix ) { free( STACK ); ThisSize = 0; } return 0; } void PoshStack( T Stack, void *Value ) { if( 0 > Stack || ThisSize <= Stack || NULL == STACK[ Stack ] ) return; if( !IsFullStack( Stack ) ) { memmove( STACK[ Stack ]->Top, Value, STACK[ Stack ]->Step ); STACK[ Stack ]->Top = ( char * )( STACK[ Stack ]->Top ) + STACK[ Stack ]->Step; } else return; } void * TopStack( T Stack ) { if( 0 > Stack || ThisSize <= Stack || NULL == STACK[ Stack ] ) return NULL; if( !IsEmptyStack( Stack ) ) return ( char * )( STACK[ Stack ]->Top ) - STACK[ Stack ]->Step; else return NULL; } void PopStack( T Stack ) { if( 0 > Stack || ThisSize <= Stack ||NULL == STACK[ Stack ] ) return; if( !IsEmptyStack( Stack ) ) STACK[ Stack ]->Top = ( char * )( STACK[ Stack ]->Top ) - STACK[ Stack ]->Step; } int IsEmptyStack( T Stack ) { if( 0 > Stack || ThisSize <= Stack || NULL == STACK[ Stack ] ) return 1; return STACK[ Stack ]->Top == STACK[ Stack ]->Element; } int IsFullStack( T Stack ) { int c; void *Temp; if( 0 > Stack || ThisSize <= Stack || NULL == STACK[ Stack ] ) return 1; c = ( ( char * )( STACK[ Stack ]->Top ) - ( char * )( STACK[ Stack ]->Element ) ) / STACK[ Stack ]->Step; if( STACK[ Stack ]->CurrentSize == c + 1 ) { STACK[ Stack ]->CurrentSize += INITSIZE; Temp = realloc( STACK[ Stack ]->Element, STACK[ Stack ]->CurrentSize * STACK[ Stack ]->Step ); if( NULL == Temp ) return 1; STACK[ Stack ]->Element = Temp; STACK[ Stack ]->Top = ( char * )( STACK[ Stack ]->Element ) + c * STACK[ Stack ]->Step; return 0; } else return 0; }
[此贴子已经被作者于2017-5-20 11:50编辑过]