zoukankan      html  css  js  c++  java
  • 数据结构之栈代码实现

    废话不多说,直接上代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    //    定义一个节点的结构
    typedef struct node
    {
        int member;            //数据域
        struct node * pNext;//指针域
    }Node,*pNode;
    
    //    定义一个栈结构
    typedef struct stack
    {
        pNode Top;            //栈顶
        pNode Bottom;        //栈底
    }Stack,* pStack;
    
    void InitStack(pStack );        //    初始化栈的函数
    int Push(pStack ,int);            //    进行压栈操作的函数
    void TraverseStack(pStack );    //    遍历栈函数
    int Empty(pStack );            //    判断栈是否为空的函数
    int Pop(pStack );                //    进行出栈操作的函数
    void Clear(pStack );            //    清空栈的函数
    
    int main(void)
    {
        Stack s;                        //    定义一个栈
        int i;
        int num;
        int data;                        //    临时保存用户输入的数据
        int re_num;                        //    保存Pop函数的返回值
        InitStack(&s);
        printf("你想输入几个数据啊:");
        scanf("%d",&num);
        for (i = 0;i < num;i++)
        {
            printf("第 %d 个数:",i+1);
            scanf("%d",&data);
            if (Push(&s,data))                //    调用Push函数
            {
                continue;
            }
            else
            {
                printf("进行进栈操作失败!
    ");
                exit(-1);
            }
        }
        TraverseStack(&s);                //    调用遍历函数
        printf("你想去掉几个数啊: ");
        scanf("%d",&data);
        printf("你去掉的数字是:");
        for (i = 0; i < data;i++)
        {
            re_num = Pop(&s);            //    调用Pop函数,并把返回值赋给re_num;
            printf("%d ",re_num);
        }
        printf("看看删除后还有啥:");
        TraverseStack(&s);
        printf("
    ");
        Clear(&s);                        //    调用清空栈函数
        printf("遍历下看看栈清空没····
    ");
        TraverseStack(&s);
        printf("
    ");
        return 0;
    }
    
    //    进行栈的初始化的函数
    void InitStack(pStack ps)
    {
        ps->Top = (pNode)malloc(sizeof(Node));        //    分配内存空间给栈顶
        if (NULL == ps->Top)
        {
            printf("动态分配内存失败
    ");
            exit(-1);
        }
        else
        {
            ps->Bottom = ps->Top;                    //    使栈底也指向栈顶空间
            ps->Top->pNext = NULL;                    //    栈顶指针置为NULL;
        }
        return ;
    }
    
    //    进行进栈操作的函数
    int Push(pStack ps,int data)
    {
        pNode pNew = (pNode)malloc(sizeof(Node));    //    定义一个新节点,并分配内存空间
        if (NULL == pNew)
        {
            return 0;
        }
        pNew->member = data;                        //    把要进栈的数据赋给新节点的member成员
        pNew->pNext = ps->Top;                        //    使新节点的指针指向栈顶
        ps->Top = pNew;                                //    把新节点作为新栈顶
    
        return 1;
    }
    
    //    遍历栈的函数
    void TraverseStack(pStack ps)
    {
        pNode pNew = ps->Top;
        while(pNew!= ps->Bottom)                //    只要栈顶不等于栈底,循环
        {
            printf("%d ",pNew->member);            //    打印栈顶的成员member
            pNew = pNew->pNext;                //    栈顶指针向下移动一次
        }
        return ;
    }
    
    //    判断栈是否为空
    int Empty(pStack ps)
    {
        if(ps->Top == ps->Bottom)    //    栈顶等于栈底,不就是栈中没数据么
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
    
    //    进行出栈操作函数
    int Pop(pStack ps)
    {
        pNode pSwap = NULL;
        int return_val;
        if (Empty(ps))                //判断栈是否为空,为空就不能进行出栈操作
        {
            exit(-1);
        }
        else
        {
            return_val = ps->Top->member;    //    把栈顶的成员member的值赋给return_val做为函数返回值
            pSwap = ps->Top;                //    使pSwap指向栈顶
            ps->Top = ps->Top->pNext;        //    使栈顶指向栈顶下一个节点
            free(pSwap);                    //    释放以前的栈顶空间
            return return_val;
        }
    }
    
    //    清空栈的函数
    void Clear(pStack ps)
    {
        pNode pNew = NULL;
    
        while (ps->Top != ps->Bottom)        //    栈顶和栈底不等,循环
        {
            pNew = ps->Top;                    //    使一个新节点和栈顶指向同一空间
            ps->Top = ps->Top->pNext;        //    使栈顶指向栈顶的下一个节点
            free(pNew);                        //    释放掉以前的栈顶空间
        }
        return ;
    }

    栈,后进先出,因为我采用的是链栈,所以指针是从栈顶top开始向栈底移动,删除元素时也是先赋值再移动指针,进栈也是先赋值再移动指针,栈顶指针指向的是最上面的元素。

  • 相关阅读:
    解决PKIX:unable to find valid certification path to requested target 的问题
    Linux 上的常用文件传输方式介绍与比较
    用VNC远程图形化连接Linux桌面的配置方法
    红帽中出现”This system is not registered with RHN”的解决方案
    linux安装时出现your cpu does not support long mode的解决方法
    CentOS SSH配置
    es6扩展运算符及rest运算符总结
    es6解构赋值总结
    tortoisegit安装、clon、推送
    es6环境搭建
  • 原文地址:https://www.cnblogs.com/2206411193qzb/p/7291356.html
Copyright © 2011-2022 走看看