• C语言实现顺序栈心得


    栈的构成及初始化

    对于“先进后出”的顺序栈,需要控制3个量:栈元素,栈顶指针,栈容量。

    栈容量即栈的最大容量,若超过会产生溢出错误。当然,必要时也可以扩充容量。

    栈元素可以通过动态数组( base[] )存放。初始化时用 malloc 申请(栈容量 * 元素类型)个空间。

    栈顶指针用于记录栈元素个数,始终指向栈顶元素的上一个单位(如 栈顶元素为base[3],栈顶指针为4),这样就能实现元素个数的记录。不过,栈顶指针只是一种形象化的叫法,方便起见,一般将其定义为 int 型。初始化时,栈顶指针置0。

    定义结构体

    struct sta
    {
        int top;
        int *base;
        int size;
    };

    typedef struct sta ZAN;

    栈的建立(分配空间)

    ZAN* create()
    {
        ZAN *p;

        p=(ZAN *)malloc(sizeof(ZAN));

        return p;
    }

    栈的初始化

    void zer(ZAN *s)
    {
        s->top=0;
        s->size=INI;                        //#define INI 10
        s->base=(int *)malloc(INI*sizeof(int));
    }

    压栈

    压栈就是让元素进栈,栈顶指针 top 加一,元素存入数组 base[] 。如果已经栈满,可以增加内存空间(实际上是重新分配空间),此时栈容量 size 也要加一。用返回值判断是否压栈成功。

    int push(ZAN *s,int x)
    {

        if( (s->top) >= (s->size) )
        {
            s->base=(int *)realloc(s->base,(s->size+1)*sizeof(int));
            if(!s->size) return 0;
            s->size++;
        }
        s->top++;
        s->base[s->top-1]=x;
        return 1;

    }

    取栈顶元素

    取顶只用把栈顶元素的值记录下来,而不需要让其出栈。可以用指针来取值。同样,用返回值判断是否取顶成功。

    int gettop(ZAN *s,int *e)
    {
        if(s->top==0) return 0;
        else
        {
            *e=s->base[(s->top)-1];
            return 1;
        }
    }

    弹栈

    弹栈是取出其值,并让栈顶元素出栈,top减一。同样,用指针记录其值,用返回值判断是否弹栈成功。

    int pop(ZAN *s,int* e)
    {
        if(!s->top) return 0;
        else
        {
            *e=s->base[(s->top)-1];
            s->top--;
            return 1;
        }
    }

    求栈长

    取出 top 的值即可

    int getlen(ZAN* s)
    {
        return s->top;
    }

    判断栈是否为空

    看 top 是否为0即可

    int isempty(ZAN* s)
    {
        if(!s->top) return 0;
        else return 1;
    }

    输出栈元素

    将 base[] 自顶向下输出即可,不对栈进行任何操作。

    void list(ZAN* s)

    {

      int i;

      puts(" list ZAN:");

      for(i=s->top-1;i>=0;i--)

      {

        if(i!=s->top-1) printf(" ");          //此处可以用空格代替换行

        printf("%d",s->base[i]);

      }

      puts("");

    }

    测试功能

    // TEST FUNCTION

    main()
    {
        ZAN *create();
        void zer(ZAN *s);
        int push(ZAN *s,int x);
        int gettop(ZAN *s,int *e);
        int getlen(ZAN* s);
        int isempty(ZAN* s);
        void list(ZAN* s);
        ZAN *s;
        int n,*e,i=1;

        i=1;e=&i;                                                           // protect


        s=create();                                                         // create a stack
        zer(s);                                                             // initialize

        if(!isempty(s)) puts("ZAN is empty ");                               // empty?
        else puts("ZAN is not not empty ");

        puts(" push int x:");                // push an element in
        scanf("%d",&n);
        if(push(s,n)) ;
        else printf(" push %d error ",n);

        if(gettop(s,e)) printf("gettop %d ",*e);                      // get top element
        else puts("gettop error");

        printf(" push int x: ");
        scanf("%d",&n);
        if(push(s,n)) ;                                            // push an element in
        else printf("push %d error ",n);


        if(gettop(s,e)) printf("gettop %d ",*e);                      // get top element
        else puts("gettop error");

        if(pop(s,e)) printf("pop %d ",*e);          //pop top element
        else printf("pop %d error ",n);

        if(gettop(s,e)) printf("gettop %d ",*e);                      // get top element
        else puts("gettop error");

        if(!isempty(s)) puts("ZAN is empty ");                               // empty?
        else puts("ZAN is not not empty ");
        if(isempty(s)) list(s);

        printf(" push int x: ");
        scanf("%d",&n);
        if(push(s,n)) ;                                            // push an element in
        else printf("push %d error ",n);

        if(isempty(s)) list(s);                  //output ZAN
    }

  • 相关阅读:
    Web前端框架与类库的思考【转】
    mouseover事件mouseenter事件
    11_Eclipse中演示Git版本号的创建,历史版本号的改动,创建分支,合并历史版本号和当前版本号
    实现了私聊和群聊功能的聊天工具
    有预处理命令#define声明一个常数,用以表明1年中有多少秒
    解决Office软件冲突问题
    pig载入两个不同字段个数的文件?load file with different items(f1有42列,f2有43列读到一个对象中)
    游戏公司通用屏蔽字列表
    Android统计图表MPAndroidChart
    HTTP状态码解析
  • 原文地址:https://www.cnblogs.com/GY8023/p/4525479.html
Copyright © 2020-2023  润新知