#include<stdio.h>
#include<stdlib.h>typedef int ElemType;
typedef struct SNode //链栈结点
{
ElemType data;
struct SNode *next;
}SNode,*StackNode;typedef struct
{
StackNode top; //因为链表的一般操作也是先进后出的,所以链栈与一般链表一样,也只需要一个头指针(top指针不指向确切值)
int stacksize;
}LinkStack;void InitStack(LinkStack *S)
{
S->top = (StackNode)malloc(sizeof(SNode));
S->stacksize = 0;
S->top->next = NULL;
}void Push(LinkStack *S ,ElemType e)
{
StackNode p;
p = (StackNode)malloc(sizeof(SNode));p->data = e;
p->next = S->top->next;
S->top->next = p;
++(S->stacksize);
}void Pop(LinkStack *S,ElemType *e)
{
StackNode p = S->top->next ;if( !S->top->next )
return ;*e = p->data;
S->top->next = p->next;
free( p ) ;
--(S->stacksize);
}void GetTop(LinkStack S, ElemType *e)
{
if( !S.top->next )
return ;
*e = S.top->next->data ;
}int StackLength(LinkStack S)
{
return S.stacksize;
}int StackEmpty(LinkStack S)
{
if(S.stacksize == 0)
{
return 1;
}
return 0;
// `return S.stacksize == 0 ;
}void Clear( LinkStack *S )
{
StackNode p = S->top->next ;
if( StackEmpty( *S ) )
return ;while( p )
{
S->top->next = p->next ;
p = S->top->next ;
S->stacksize-- ;
}
}void Destroy( LinkStack *S )
{
ElemType e ;while( !StackEmpty( *S ) )
{
Pop( S , &e ) ;
}
free( S->top ) ;
}void StackTraverse( LinkStack S , void (*visit)( ElemType e ) )
{ //从栈底到栈顶依次对S的每个数据调用函数visit.
LinkStack Sa ;
ElemType e ;
StackNode p = S.top->next ;if( StackEmpty( *S ) )
return ;
InitStack( &Sa ) ;
while( p )
{
Push( &Sa , p->data ) ;
p = p->next ;
}while( Sa.top->next ) //还有一种方法:用递归,但是递归消耗太大
{
Pop( &Sa , &e ) ;
visit( e ) ;
}
free( Sa.top ) ;
}void visit( ElemType e )
{
printf( "%d ", e ) ;
}int main( )
{
LinkStack S;
ElemType e;InitStack(&S);
Push(&S,3);
Push(&S,4);
Push(&S,5);
StackTraverse(S , visit);
printf( "\n" ) ;Pop(&S,&e);
printf("%d\n",e);return 0 ;
}
第三章(2).链栈
最新推荐文章于 2022-08-17 21:50:18 发布