[c++]代码库
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OK 1
#define EQUAL 1
#define OVERFLOW -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status ;
struct STU
{
char name[20];
char stuno[10];
int age;
int score;
};
typedef struct STU SElemType;
struct STACK
{
SElemType *base;
SElemType *top;
int stacksize;
};
typedef struct STACK SqStack;
typedef struct STACK *pSqstack;
Status InitStack ( SqStack **S );
Status DestroyStack ( SqStack *S );
Status ClearStack ( SqStack *S );
Status StackEmpty ( SqStack S );
int StackLength ( SqStack S );
Status GetTop ( SqStack S,SElemType *e );
Status Push ( SqStack *S,SElemType e );
Status Pop ( SqStack *S,SElemType *e );
Status StackTraverse ( SqStack S,Status ( *visit ) () );
Status InitStack ( SqStack **S )
{
( *S ) = ( SqStack * ) malloc ( sizeof ( SqStack ) );
( *S )->base= ( SElemType * ) malloc ( STACK_INIT_SIZE *sizeof ( SElemType ) );
if ( ! ( *S )->base ) exit ( OVERFLOW );
( *S )->top= ( *S )->base;
( *S )->stacksize=STACK_INIT_SIZE;
return OK;
}
Status DestroyStack ( SqStack *S )
{
free ( S->base );
free ( S );
}
Status ClearStack ( SqStack *S )
{
S->top=S->base;
}
Status StackEmpty ( SqStack S )
{
if ( S.top==S.base ) return TRUE;
else
return FALSE;
}
int StackLength ( SqStack S )
{
int i;
SElemType *p;
i=0;
p=S.top;
while ( p!=S.base )
{
p++;
i++;
}
}
Status GetTop ( SqStack S,SElemType *e )
{
if ( S.top==S.base ) return ERROR;
*e=* ( S.top-1 );
return OK;
}
Status Push ( SqStack *S,SElemType e )
{
/*
if(S->top - S->base>=S->stacksize)
{
S->base=(SElemType *) realloc(S->base,
(S->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!S->base)exit(OVERFLOW);
S->top=S->base+S->stacksize;
S->stacksize += STACKINCREMENT;
}
*/
* ( S->top++ ) =e;
return OK;
}
Status Pop ( SqStack *S,SElemType *e )
{
if ( S->top==S->base ) return ERROR;
*e=*--S->top;
return OK;
}
Status StackPrintElem ( SElemType * e )
{
printf ( "%s %s %d %d\n",e->name,e->stuno,e->age,e->score );
}
Status StackTraverse ( SqStack S,Status ( *visit ) () )
{
while ( S.top!=S.base )
visit ( --S.top );
}
main()
{
SElemType e;
SqStack *Sa;
clrscr();
printf ( "\n\n-------------------SqStack Demo is running...----------------\n\n" );
printf ( "First is Push function.\n" );
InitStack ( &Sa );
strcpy ( e.name,"stu1" );
strcpy ( e.stuno,"100001" );
e.age=80;
e.score=1000;
printf ( " Now Stack is Empty.\n" );
StackTraverse ( *Sa,StackPrintElem );
Push ( Sa,e );
printf ( " Now Stack has one element.\n" );
StackTraverse ( *Sa,StackPrintElem );
strcpy ( e.name,"stu3" );
strcpy ( e.stuno,"100002" );
e.age=80;
e.score=1000;
Push ( Sa,e );
printf ( " Now Stack has another element.\n" );
StackTraverse ( *Sa,StackPrintElem );
printf ( " Now Pop Stack,the top elem put into variable e.\n" );
Pop ( Sa,&e );
printf ( "%s\n%s\n%d\n%d\n",e.name,e.stuno,e.age,e.score );
printf ( " Let's see the left of Stack's elem:\n" );
StackTraverse ( *Sa,StackPrintElem );
getch();
printf ( "\n\n\nWelcom to visit http://zmofun.topcool.net\n\n" );
}