zoukankan      html  css  js  c++  java
  • 数据结构与算法分析-用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));
    }
    

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


  • 相关阅读:
    生成器 和 生成器 表达式
    函数的三大器
    02.python网络爬虫第二弹(http和https协议)
    python网络爬虫第三弹(<爬取get请求的页面数据>)
    线程
    网络编程
    分时操作系统 与 多道程序系统
    javascript原型深入解析2--Object和Function,先有鸡先有蛋
    javascript原型深入解析1-prototype 和原型链、js面向对象
    js模块化
  • 原文地址:https://www.cnblogs.com/mrbourne/p/9959460.html
Copyright © 2011-2022 走看看