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

这种方法用链表来表示栈,头结点始终指向栈顶的元素,每次入栈就是在头结点后面插入一个元素,而出栈则是删除头结点后面的那个元素,思想很简单,有了链表的基础,实现起来也是很容易的。那么老规矩,先将栈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\t",Top(S));
        Pop(S);
    }
    return 0;
}


posted @ 2014-05-20 10:41  庄浩  阅读(217)  评论(0编辑  收藏  举报