用单链表实现栈并不是最好的方法,因为出入栈都要涉及指针的操作,在一些情况下这些操作可能会花费过长的时间,最简单实现栈的方法还是用数组的方式,用一个int型的数字表示栈顶元素的位置,进栈和出栈只需要对这个数字进行自加或自减就可以了。缺点是需要提前知道栈的大小,不支持动态增加栈的容量。
首先,老规矩,声明结构,类型,和常用例程。
/**
* @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 StackRecord;
typedef struct StackRecord *Stack;
//常用例程
int IsEmpty(Stack S); //判空
int IsFull(Stack S); //判满
Stack CreateStack(int MaxElements); //创建新栈
void DisposeStack(Stack S); //消除栈
void MakeEmpty(Stack S); //置空
void Push(ElementType X,Stack S); //入栈
void Pop(Stack S); //出栈
ElementType TopAndPop(Stack S); //出栈并返回栈顶元素
void FatalError(char *); //错误信息
#endif // _Stack_h
接下来是实现部分。
/**
* @file Stack.c
* @brief 用数组实现栈-实现部分
* @details
* @author jason.mrbourne@gmail.com
* @date 2014-5-20
*/
#include <Stack.h>
#include <stdio.h>
#define EmptyTOS (-1) //空栈栈顶位置
#define MinStackSize (5) //最小栈大小
//栈的结构
struct StackRecord
{
int Capacity; //容量,即最大元素个数
int TopOfStack; //栈顶位置
ElementType *Array; //保存栈内元素的数组
};
//错误信息
void FatalError(char* str)
{
printf("%s", str);
}
//创建一个栈
Stack CreateStack(int MaxElements)
{
Stack S;
//不能小于规定的最小大小
if (MaxElements < MinStackSize)
FatalError("Stack is too small.");
//为栈申请空间
S = malloc(sizeof(struct StackRecord));
if (S==NULL)
FatalError("Out of space.");
//为栈内数组申请空间
S->Array = malloc(sizeof(ElementType)*MaxElements);
if (S->Array == NULL)
FatalError("Out of Space");
S->Capacity = MaxElements;
MakeEmpty(S);
return S;
}
//消除栈
void DisposeStack(Stack S)
{
if (S != NULL)
{
free(S->Array); //先释放S->Array,若先释放S则无法引用S->Array
free(S);
}
}
//判断栈是否为空
int IsEmpty(Stack S)
{
return S->TopOfStack == EmptyTOS;
}
//判断栈是否已满
int IsFull(Stack S)
{
return S->TopOfStack == S->Capacity;
}
//置空栈
void MakeEmpty(Stack S)
{
S->TopOfStack = EmptyTOS;
}
//入栈
void Push(ElementType X, Stack S)
{
if (IsFull(S))
FatalError("Full Stack.");
else
S->Array[++S->TopOfStack] = X;
}
//出栈
void Pop(Stack S)
{
if (IsEmpty(S))
FatalError("Empty Stack");
else
S->TopOfStack--;
}
//出栈并返回栈顶元素
ElementType TopAndPop(Stack S)
{
if (IsEmpty(S))
FatalError("Empty Stack");
else
return S->Array[S->TopOfStack--];
return 0;
}
最后我们在main函数中测试。
/**
* @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(100);
Push(1,S);
Push(2,S);
Push(3,S);
while (!IsEmpty(S))
printf("%d ", TopAndPop(S));
}
一定要自己敲几遍才能掌握,多动手才可能真正弄懂,只看是不行的,学习编程没有捷径,必须要一个一个程序得编,一个一个算法得背。