鱼C论坛

 找回密码
 立即注册
查看: 1884|回复: 0

[学习笔记] 栈知识总结

[复制链接]
发表于 2019-8-1 20:29:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
线性结构的两种常见的应用之一:栈定义:一种可以实现“先进后出”的存储结构(类似于箱子)


分类:
静态栈
动态栈:


算法:
出栈
压栈


直接上代码好理解:
#include<stdio.h>
#include<mallloc.h>
#include<stdlib.h>

typedef struct Node
{
        int data;
        struct Node *pNext;
}NODE,*PNODE;

typedef struct Stack
{
        //pTop永远指向顶部,pBottom永远指向底部
        PNODE pTop;
        PNODE pBottom;
}STACK,*PSTACK;

void initStack(PSTACK pS)
{
        //造出一个节点,并且让pTopS指向这个节点
        pS->pTop=(PDONE)malloc(sizeof(NODE));
        if(NULL=pS->pTop)
        {
                printf("动态内存分配失败!");
                exit(-1);
        }
        else
        {
                pS->pButtom=pS->pTop;
                //让指向的这个节点的指针域指向NULL
                pS->pTop->pNext-NULL;
        }
        
}

void push(PSTACK pS,int val)
{
        //先造出一个节点来保存val的值
        PNODE pNew=(PNODE)malloc(sizeof(NDOE));
        //将新的节点的数据域变成val
        pNew->data=val;
        //将新的节点的指针域指向下一个节点(每次压入都是压入栈顶的上方
        pNew->pNext=pS->pTop;
        //将pTop指向新的节点
        pS->pTop=pNew;

}

void traverse(PSTACK pS)
{
        //先定义一个p永远指向栈顶元素
        PNODE p=pS->pTop;
        while(p!=pS->pBottom)
        {
                printf("%d ",p->data);
                p=p->pNext;
        }
        printf("\n");
        return;
}

bool is_empty(PSTACK pS)
{
        if(pS->pTop==pS->pBottom)
                return true;
        else
                return false
}

//把pS所指向的栈出栈一次,并把出栈的元素存入pVal所指向的变量中,如果出栈失败,返回false
bool pop(PSTACK pS,int *pVal)
{
        if(is_empty(pS))  //pS本身存放的就是S的地址
                return false;
        else
        {        
                PNODE r=pS->pTop;
                *pVal=r->data;
                pS->pTop=r->pNext;
                free(r);
                r=NULL;
                return true;
        }

}

void clear(PSTACK pS)  //清空
{
        if(is_empty(pS))
        {
                return;
        }
        else
        {
                PNODE p=pS->pTop;
                PNODE q=NULL;
                while(p!=pS->pBottom)
                {
                        q=p->pNext;
                        free(p);
                        p=q;
                }
                pS->pTop=pS->pBottom;
        }

}


int main()
{
        int val;
        //相当于我们的S内存中有pTop pBottom两个变量,但是变量里面还没有存放有效的信息
        STACK S;  //STACK等价于struct Stack
        init(&S);  //目的是造出一个空栈
        push(&S,1);   //压栈
        push(&S,2);
        traverse(&S);  //遍历输出

        if(pop(&S,&val))
        {
                printf("出栈成功,出栈的元素是:%d \n",val);
        }
        else
                printf("出栈失败!");

        traverse(&S);  //遍历输出

        clear(&S);
        traverse(&S);  //遍历输出

        return 0;
}

应用:
函数调用
中断
表达式求值
内存分配
缓冲处理
迷宫


线性结构的两种常见的应用之二:队列(先进先出)




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 10:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表