ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

14栈

2022-07-01 12:35:39  阅读:149  来源: 互联网

标签:pS 出栈 14 void PSTACK pTop 节点


栈(单口先进后出)

静态分配:用栈分配(入栈出栈)

动态分配:用堆分配(堆排序分配内存)

  1. 定义:

    ​ 一种可以实现“先进后出”的储存结构,栈类似于箱子。

  2. 分类

​ 静态栈

​ 动态栈(链表)

  1. 算法

    ​ 出栈

    ​ 压栈

  2. 应用

​ 函数调用

​ 中断

​ 表达式求值

​ 内存分配

​ 缓冲处理

​ 迷宫(具体算法)

程序

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node * pNext
}NOTE,* PNOTE;

typedef struct Stack
{
    PNOTE pTop;   //指向栈顶部
    PNOTE pBottom;//指向栈底部(指向有效节点的下一个节点称头节点)
}STACK,* PSTACK;

void init(PSTACK);
void push(PSTACK, int);
void traverse(PSTACK);
bool empty(PSTACK pS);
bool pop(PSTACK, int *);//出栈一次,把出栈元素保存
void clear(PSTACK pS);//清空节点


int main(void)
{
    STACK S;//STACK等价于struct Stack
    init(&S);//初始化:产生空栈
    push(&S, 1);//压栈:输入数据
    push(&S, 2);
    push(&S, 3);
    push(&S, 4);
    push(&S, 5);
    push(&S, 6);
    traverse(&S);//遍历输出
    clear(&S);//清空
    traverse(&S);//清空后遍历确认
    
    if(pop(&S, &val))//保存出栈的值
    {
        printf("出栈成功,出栈元素是%d\n", val);
    }
    else
    {
        printf("出栈失败!\n");
    }
    
    
    
    
    return 0;
}

//初始化:pTop,pBottom都指向一个无用的头节点
void init(PSTACK pS)
{
    pS->pTop = (PNOTE)malloc(sizeof(NOTE));//头节点地址放入
    if(NULL==pS->pTop)
    {
        printf("动态分配内存失败!\n");
        exit(-1);
    }
    else
    {
        pS->pBottom = pS->pTop;//都指向头节点
        pS->pTop->pNext = NULL;//或者:pS->Bottom->pNext = NULL;
    }
}
//堆栈
void push(PSTACK pS, int val)
{
    PNODE pNew = (PNOTE)malloc(sizeof(NOTE));
    pNew = data = val;
    pNew->pNext = pS->pTop;//新节点指针域指向头节点,pS->pTop不能换成pS->pBottom
    pS->pTop = pNew;//pS->pTop指向新节点
    return;
}
//遍历输出
void traverse(PSTACK pS)
{
    PNODE p = pS->pTop;
    while(p != pS->pBattom)
    {
        printf("%d",p->data);
        p = p->pNext;
    }
    printf("\n");
    return;
}
//判断栈是否为空
bool empty(PSTACK pS)
{
    if(pS->pTop==pS->pBattom)
        return true;
    else
        return false;
}
//把sP所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的向量中,如果出栈成功返回ture,失败返回false
bool pop(PSTACK pS, int * pVal)
{
    if(empt(pS))
    {
        return false;
    }
    else
    {
        PNOTE r = pS->pTop;//删除先定义变量保存要删除节点地址,之后释放掉
        pS->pTop = r->pNext;//pS->pTop指针指向下一个
        *pVal = r->data;//r->data赋值给Val
        free(r);//释放内存
        r = NULL;//清空节点内存
        return true;
    }
}
//clear:清空栈内数据
void clear(PSTACK pS)
{
    if(empty(pS))
    {
        return;
    }
    else
    {
        PNOTE p = pS->pTop;
        PNOTE q = NULL;
        while(p!=pS->pBottom)
        {
            q = p->pNext;//q指向p的下一个元素,pTop = p->pNext;也可以
            free(p);//释放p的内存
            p = q;//从下个节点重新如此
        }
        pS->pTop = pS->pBottom;//pTop代替q,最后pS->pTop = pS->pBottom自动达到
    }
}

标签:pS,出栈,14,void,PSTACK,pTop,节点
来源: https://www.cnblogs.com/chentongxue/p/16434182.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有