zoukankan      html  css  js  c++  java
  • 数据结构与算法分析-用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	",Top(S));
            Pop(S);
        }
        return 0;
    }
    


  • 相关阅读:
    [Android]XML那些事儿-manifest属性2
    [Android]数据存储-SharedPreferences1
    [Android]2013.5.4日志
    [Android]获得Andriod手机屏幕分辨率的两种方法
    [Android]Java-break(label)/return/continue语句详解
    [WordPress]欢迎使用 WordPress for SAE
    [Webkit]最简单易用的webkit学习环境-ISee
    [Webkit]了解WebKit与Qt WebKit对比区别
    [PhoneGap]开发环境搭建与简单应用
    LeetCode-62.Unique Paths
  • 原文地址:https://www.cnblogs.com/mrbourne/p/9959461.html
Copyright © 2011-2022 走看看