数据结构与算法分析-用C语言实现栈(数组方式)

用单链表实现栈并不是最好的方法,因为出入栈都要涉及指针的操作,在一些情况下这些操作可能会花费过长的时间,最简单实现栈的方法还是用数组的方式,用一个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));
}

一定要自己敲几遍才能掌握,多动手才可能真正弄懂,只看是不行的,学习编程没有捷径,必须要一个一个程序得编,一个一个算法得背。


原文地址:https://www.cnblogs.com/mrbourne/p/9959460.html