1、栈的链表实现
通过链表前端的插入来实现push,通过删除表前端元素来实现pop。
栈链表的类型声明:
struct Node;
typeof struct Node *PtrToNode;
typeof PtrToNode Stack;
int IsEmpty( Stack S );
Stack CreateStack( void );
void DisposeStack( Stack S );
void MakeEmpty( Stack S );
void Push( ElementType X,Stack S );
ElementType Top( Stack S );
void Pop(Stack S);
struct Node{
ElementType Element;
PtrToNode Next;
}
判断是否是空栈
int IsEmpty(Stack S) {
return S->Next == Null;
}
创建一个空栈
Stack CreateStack( void ) {
//让表头节点指向空
Stack S;
S = malloc( sizeof( struct Node ) );
if( S == Null ) Error( "Out of space!" );
S->Next == Null;
MakeEmpty( S );
returen S;
}
void MakeEmpty( Stack S ) {
if( S == Null ) Error( "Must use CreateStack first");
else
while( !IsEmpty( S ) )
Pop(S);
}
进栈、出栈和去栈顶操作
void Push( ElementType X, Stack S ) {
PtrToNode TmpCell;
TmpCell = malloc( sizeof( struct Node ) );
if( TmpCell == Null ) Error("Out of space");
else
{
TmpCell->Element = X;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
}
void Pop( Stack S ) {
PtrToNode FirstCell;
if( IsEmpty( S ) ) {
Error(" Empty Stack ");
}
else {
FirstCell = S->Next;
S->Next = S->Next->Next;
free( FirstCell );
}
}
ElementType Top( Stack S ) {
if( !IsEmpty( S ) ) {
return S->Next->Element;
}
Error(" Empty stack ");
return 0;
}
2、栈的数组实现
数组方式实现栈的进栈和出栈
void Push( ElementType X,Stack S ){
if( IsFull( S ) ) { //判断栈是否慢
Error(" Full Stack ");
}
else {
//栈顶先自增,然后赋值X
S->Array[ ++S->TopOfStack ] = x;
}
void Pop( Stack S ) {
if( IsEmpty( S ) ){
Error("Empty Stack");
}
else {
S->TopOfStack--;
}
}