Julia999 发表于 2019-8-1 20:29:02

栈知识总结

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


分类:
静态栈
动态栈:


算法:
出栈
压栈


直接上代码好理解:
#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;
}



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


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




页: [1]
查看完整版本: 栈知识总结