这种方法用链表来表示栈,头结点始终指向栈顶的元素,每次入栈就是在头结点后面插入一个元素,而出栈则是删除头结点后面的那个元素,思想很简单,有了链表的基础,实现起来也是很容易的。那么老规矩,先将栈ADT的声明部分放在Stack.h这个头文件里。代码如下:
/**
* @file Stack.h
* @brief 用链表实现栈-声明ADT部分
* @details
* @author jason.mrbourne@gmail.com
* @date 2014-5-20
*/
#include <stdio.h>
#ifndef _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(Stack S,ElementType X); //进栈
ElementType Top(Stack S); //返回栈顶元素
void Pop(Stack S); //出栈
void FatalError(char *Str); //打印错误信息
#endif // _Stack_h
第二步就是把这些例程逐个来实现,代码如下:
/**
* @file Stack.c
* @brief 用链表实现栈-实现部分
* @details
* @author jason.mrbourne@gmail.com
* @date 2014-5-20
*/
#include <Stack.h>
#include <stdio.h>
//用节点表示栈中元素
struct Node
{
ElementType Element;
PtrToNode Next;
};
//栈是否为空
int IsEmpty(Stack S)
{
return S->Next == NULL;
}
//错误信息
void FatalError(char *str)
{
printf("%s",str);
}
//置空栈
void MakeEmpty(Stack S)
{
if(S == NULL)
FatalError("Must use CreateStack first");
else
while(!IsEmpty(S))
Pop(S);
}
//创建一个空栈
Stack CreateStack(void)
{
Stack S;
S = malloc(sizeof(struct Node));
if(S == NULL)
FatalError("Out of space!!!");
S->Next = NULL; //S->Next指向栈顶
MakeEmpty(S);
return S;
}
//进栈 插入到s后面 即放入栈顶
void Push(Stack S,ElementType X)
{
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;
FatalError("Empty Stack!");
return 0;
}
//出栈
void Pop(Stack S)
{
PtrToNode FirstCell;
if(IsEmpty(S))
FatalError("Empty Stack!!!");
else
{
FirstCell = S->Next;
S->Next = FirstCell->Next;
free(FirstCell);
}
}
最后,我们在主函数中测试一下,到底我们实现的栈能不能正常使用,结果是逆序输出,符合栈后进先出的逻辑规则.
代码如下:
/**
* @file main.c
* @brief 用链表实现栈-测试部分
* @details
* @author jason.mrbourne@gmail.com
* @date 2014-5-20
*/
#include <stdio.h>
#include <stdlib.h>
#include <Stack.h>
int main()
{
//使用我们实现的栈 向其中放入3个元素 并依次弹出
Stack S = CreateStack();
Push(S,1);
Push(S,2);
Push(S,3);
while(!IsEmpty(S))
{
printf("%d ",Top(S));
Pop(S);
}
return 0;
}