数据结构之链栈实现
代码及思想
#include < iostream>
#include < cstdio>
#include < cstdlib>
using namespace std;
#define ElemType int
#define Status int
#define OK 1
#define ERROR 0
typedef struct StackNode
{
ElemType data;
struct StackNode * next;
} StackNode, * LinkStackPtr;
typedef struct LinkStack
{
int length;
LinkStackPtr top;
} LinkStack;
Status LinkStackInit ( LinkStack & S ) ;
Status IsEmpty ( LinkStack & S ) ;
Status GetTop ( LinkStack & S , ElemType & x) ;
Status Push ( LinkStack & S , ElemType x) ;
Status Pop ( LinkStack & S , ElemType & x) ;
int LinkStackLength ( LinkStack S ) ;
void LinkStackTraverse ( LinkStack & S ) ;
Status LinkStackDestroy ( LinkStack & S ) ;
Status LinkStackInit ( LinkStack & S )
{
S . top = ( StackNode * ) malloc ( sizeof ( StackNode) ) ;
if ( S . top== NULL )
{
cout<< "*申请空间失败" << endl;
return ERROR ;
}
S . top- > next = NULL ;
S . top- > data = 999 ;
S . length = 0 ;
return OK ;
}
Status IsEmpty ( LinkStack & S )
{
if ( S . length > 0 )
return ERROR ;
return OK ;
}
Status GetTop ( LinkStack & S , ElemType & x)
{
if ( IsEmpty ( S ) )
{
return ERROR ;
}
x = S . top- > data;
return OK ;
}
Status Push ( LinkStack & S , ElemType x)
{
LinkStackPtr newnode = ( LinkStackPtr) malloc ( sizeof ( StackNode) ) ;
newnode- > data = x;
newnode- > next = S . top;
S . top = newnode;
S . length++ ;
return OK ;
}
Status Pop ( LinkStack & S , ElemType & x)
{
if ( IsEmpty ( S ) )
{
return ERROR ;
}
x = S . top- > data;
LinkStackPtr temp = S . top; ;
S . top = S . top- > next;
free ( temp) ;
S . length-- ;
return OK ;
}
int LinkStackLength ( LinkStack S )
{
if ( ! IsEmpty ( S ) )
return S . length;
return 0 ;
}
void LinkStackTraverse ( LinkStack & S )
{
LinkStackPtr H = S . top;
while ( H - > next)
{
cout<< H - > data<< " " ;
H = H - > next;
}
cout<< endl;
}
Status LinkStackDestroy ( LinkStack & S )
{
LinkStackPtr temp;
while ( ! IsEmpty ( S ) )
{
temp = S . top;
S . top = S . top- > next;
free ( temp) ;
S . length-- ;
}
return OK ;
}
int main ( )
{
LinkStack S ;
int topNum, popNum;
LinkStackInit ( S ) ;
cout<< "1、初始化链栈数据为1-10" << endl;
for ( int i= 1 ; i< 11 ; i++ )
Push ( S , i) ;
cout<< "#当前栈中元素为:" << endl;
LinkStackTraverse ( S ) ;
cout<< "#当前栈中元素个数为:" << LinkStackLength ( S ) << endl;
cout<< endl;
GetTop ( S , topNum) ;
cout<< "2、当前栈顶元素为:" << topNum<< endl;
cout<< endl;
cout<< "3、弹出两个栈顶元素" << endl;
Pop ( S , popNum) ;
cout<< "#其中第一个为:" << popNum<< endl;
Pop ( S , popNum) ;
cout<< "#其中第二个为:" << popNum<< endl;
cout<< endl;
cout<< "3、当前栈中元素为:" << endl;
LinkStackTraverse ( S ) ;
GetTop ( S , topNum) ;
cout<< "#当前栈顶元素为:" << topNum<< endl;
cout<< "#当前栈中元素个数为:" << LinkStackLength ( S ) << endl;
return 0 ;
}
测试截图