顺序栈的9个基本操作
定义常量
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE 0
typedef int Status;
结构体定义和函数声明
#define STACK_INIT_SIZE 30
#define STACKINCREMENT 10
typedef struct
{
SElemType* base;
SElemType* top;
int stacksize;
} SqStack;
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) ( SElemType* ) ) ;
Status visit ( SElemType* e) ;
函数定义
Status InitStack ( SqStack* S)
{
S-> base = ( SElemType* ) malloc ( STACK_INIT_SIZE * sizeof ( SElemType) ) ;
if ( ! S-> base)
{
printf ( "创建失败!\n" ) ;
exit ( - 1 ) ;
}
S-> top = S-> base;
S-> stacksize = STACK_INIT_SIZE;
return OK;
}
Status DestroyStack ( SqStack* S)
{
free ( S-> base) ;
S-> base = NULL ;
S-> top = NULL ;
S-> stacksize = 0 ;
return OK;
}
Status ClearStack ( SqStack* S)
{
S-> top = S-> base;
return OK;
}
Status StackEmpty ( SqStack S)
{
if ( S. top == S. base)
return TRUE;
else
return FALSE;
}
int StackLength ( SqStack S)
{
return S. stacksize;
}
Status GetTop ( SqStack S, SElemType* e)
{
if ( S. top == S. base)
return ERROR;
else
{
* e = * ( S. top - 1 ) ;
return OK;
}
}
Status Push ( SqStack* S, SElemType e)
{
if ( S-> top - S-> base >= S-> stacksize)
{
SElemType * temp = ( SElemType* ) realloc ( S-> base, ( S-> stacksize + STACKINCREMENT) * sizeof ( SElemType) ) ;
if ( ! temp) exit ( ERROR) ;
S-> base = temp;
S-> top = S-> base + S-> stacksize;
S-> stacksize + = STACKINCREMENT;
}
* ( S-> top) = e;
S-> top++ ;
return OK;
}
Status Pop ( SqStack* S, SElemType* e)
{
if ( S-> top == S-> base)
return ERROR;
S-> top-- ;
* e = * S-> top;
return OK;
}
Status StackTraverse ( SqStack S, Status ( * visit) ( SElemType* ) )
{
while ( S. top != S. base)
{
S. top-- ;
visit ( S. top) ;
}
printf ( "\n" ) ;
return OK;
}
测试
int main ( )
{
SqStack S;
InitStack ( & S) ;
if ( StackEmpty ( S) )
printf ( "空栈!\n" ) ;
else
printf ( "不是空栈!\n" ) ;
SElemType i;
for ( i = 1 ; i <= 100 ; i++ )
{
Push ( & S, i) ;
}
StackTraverse ( S, visit) ;
printf ( "栈长:%d\n" , StackLength ( S) ) ;
SElemType x;
GetTop ( S, & x) ;
printf ( "顶元素:%d\n" , x) ;
SElemType e;
if ( Pop ( & S, & e) )
printf ( "出栈成功:%d\n" , e) ;
else
printf ( "出栈失败!\n" ) ;
if ( Pop ( & S, & e) )
printf ( "出栈成功:%d\n" , e) ;
else
printf ( "出栈失败!\n" ) ;
StackTraverse ( S, visit) ;
if ( ClearStack ( & S) )
printf ( "置空成功!\n" ) ;
else
printf ( "置空失败!\n" ) ;
if ( StackEmpty ( S) )
printf ( "空栈!\n" ) ;
else
printf ( "不是空栈!\n" ) ;
if ( DestroyStack ( & S) )
printf ( "销毁成功!\n" ) ;
else
printf ( "销毁失败!\n" ) ;
return 0 ;
}
Status visit ( SElemType* e)
{
printf ( "%d " , * e) ;
return OK;
}
运行结果