• 数据结构与算法分析-用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;
    }
    


  • 相关阅读:
    解释JUnit中@BeforeClass和@AfterClass标注的方法必须是static的,而在TestNg不必
    总结TestNg与JUnit的异同
    FitNesseRoot/ErrorLogs目录下可查看fitnesse输出日志
    项目构建工具ant的使用
    用插件maven-surefire-report-plugin生成html格式测试报告
    fitnesse生成的FitNesseRoot路径问题
    fitnesse管理引进的jar包
    简要总结selenium四个工具组
    selenium 2 设置浏览器安装路径
    磁盘IO
  • 原文地址:https://www.cnblogs.com/mrbourne/p/9959461.html
Copyright © 2020-2023  润新知