// Stack.h
typedef int ElementType;
#ifndef STACK_H_
#define STACK_H_
// 结点的前向声明,具体实现在.c文件
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
int IsEmpty( Stack S );
Stack CreateStack( void );
void DestroyStack( Stack *S );
void MakeEmpty( Stack S );
void Push( ElementType X, Stack S );
// 返回栈顶元素
ElementType Top( Stack S );
// 只弹出栈顶元素,不返回此元素
void Pop( Stack S );
// 弹出栈顶元素,同时返回此元素
ElementType TopAndPop( Stack );
#endif
// Stack.c
#include "Stack.h"
#include <stdlib.h>
#include <assert.h>
struct Node{
ElementType Element;
PtrToNode Next;
};
int IsEmpty( Stack S )
{
return S->Next == NULL;
}
//************************************
// Method: CreateStack
// FullName: CreateStack
// Access: public
// Returns: Stack
// Qualifier: 链式堆栈,链表带头结点
// Parameter: void
//************************************
Stack CreateStack( void )
{
Stack S;
S = malloc( sizeof( struct Node ) );
assert( S != NULL );
S->Next = NULL;
MakeEmpty( S );
return S;
}
void MakeEmpty( Stack S )
{
assert( S != NULL );
while( !IsEmpty( S ) )
Pop( S );
}
void DestroyStack( Stack *S )
{
MakeEmpty( *S );
free( *S );
// 将头结点释放后置为NULL,
// 防止悬挂指针
*S = NULL;
}
void Push( ElementType X, Stack S )
{
PtrToNode TmpCell;
TmpCell = malloc( sizeof( struct Node ) );
assert( TmpCell != NULL );
TmpCell->Element = X;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
ElementType Top( Stack S )
{
// 确保S不为空栈
assert( !IsEmpty( S ) );
return S->Next->Element;
}
void Pop( Stack S )
{
PtrToNode FirstCell;
// 确保S不为空栈
assert( !IsEmpty( S ) );
FirstCell = S->Next;
S->Next = FirstCell->Next;
free( FirstCell );
}
ElementType TopAndPop( Stack S )
{
PtrToNode FirstCell;
ElementType X;
// 确保S不为空栈
assert( !IsEmpty( S ) );
FirstCell = S->Next;
X = FirstCell->Element;
S->Next = FirstCell->Next;
free( FirstCell );
return X;
}
// TestStack.c
#include "Stack.h"
#include <stdio.h>
int main()
{
Stack S = NULL;
S = CreateStack();
Push( 520, S );
Push( 1314, S );
while( !IsEmpty(S) )
printf( "出栈元素是: %d\n", TopAndPop(S) );
return 0;
}
|