栈ADT
栈模型
栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。对栈的基本操作有 P u s h Push Push(进栈)和 P o p Pop Pop(出栈),前者相当于插入,后者则是删除最后 插入的元素。最后插入的元素可以通过使用 T o p Top Top例程在执行 P o p Pop Pop之前进行考查。对空栈进行的 P o p Pop Pop或 T o p Top Top一般被认为是栈的ADT的错误。另一方面,当运行 P u s h Push Push时空间用尽是一个实现错误,但不是ADT错误。
栈有时叫做LIFO(后进先出) 表。一般的模型是,存在某个元素位于栈顶,而该元素是唯一的可见元素。
栈的实现
栈的链表实现
首先,给出一些定义。实现栈要用到一个表头。
#ifndef _Stack_h
#define _Stack_h
typedef int ElementType;
struct Node;
typedef struct Node *PtrToNode;
typedef 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 );
#endif /* _Stack_h */
/* Place in implementation file */
/* Stack implementation is a linked list with a header */
struct Node
{
ELementType X;
PrtToNode Next;
};
下面给出测试空栈的代码,测试空栈与测试空表的方式相同。
int IsEmpty(Stack S)
{
return S->Next == NULL;
}
创建一个空栈,我们只要建立一个头结点; M a k e E m p t y MakeEmpty MakeEmpty设置 N e x t Next Next指针指向 N U L L NULL NULL。
Stack CreateStack(void)
{
Stack S;
S = malloc(sizeof(struct Node));
if(S == NULL)
FatalError("Out of space!!!");
S->Stack = NULL;
MakeEmpty(S);
return S;
}
void MakeEmpty(Stack S)
{
if(S == NULL)
Error("Must use CreateStack first");
else
while(!IsEmpty(S))
Pop(S);
}
P u s h Push Push是作为向链表前端进行插入而实现的,其中,表的前端作为栈顶。
void Push(ElementType X, Stack S)
{
PtrToNode TmpCell;
TmpCell = (PtrToNode)malloc(sizeof(struct Node));
if(TmpCell == NULL)
FatalError("Out of space!!!");
else
{
TmpCell->Element = X;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
}
T o p Top To