1、栈模型
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶。对栈的基本操作有Push(进栈)和Pop(出栈),前者相当于插入,后者删除最后插入的元素。栈有时又叫做后进先出表(LIFO)
栈ADT链表的实现的类型声明
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);
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)
FatalError("Out of sapce!")
S->Next == NULL;
MakeEmpty(S);
return S;
}
void
MakeEmpty(Stack S)
{
if(S == NULL)
Error("Must use CreateStack first");
else
while(!IsEmpty(S))
Pop(S);
}
Push进栈的例程——链表实现
void
Push(ElementType X,Stack S)
{
PtrToNode TmpCell;
TmpCell = malloc(sizeof(struct Node));
if (TmpCell == NULL)
FatalError("Out of space!")
else
{
TmpCell->Element = X;
TmpCell->Next = S->Next;
S->Next = TmpCell;
}
}
返回栈顶元素的例程
ElementType
Top(Stack S)
{
if(!IsEmpty(S))
return S->Next->Element;
Error("Empty stack");
return 0;
}
从栈弹出元素的例程
void
Pop(Stack S)
{
PtrToNode FirstCell;
if(IsEmpty(S))
Error("Empty stack");
else
{
FirstCell = S->Next;
S->Next =S->Next->Next;
free(FirstCell)
}
}