堆栈(Strack)是指这样一段内存,它可以理解为一个筒结构,先放进筒中的数据被后放进筒中的数据“压住”,只有后放进筒中的数据都取出后,先放进去的数据才能被取出,称为“后进先出”。堆栈的长度可随意增加

简介: 堆栈(Strack)是指这样一段内存,它可以理解为一个筒结构,先放进筒中的数据被后放进筒中的数据“压住”,只有后放进筒中的数据都取出后,先放进去的数据才能被取出,称为“后进先出”。堆栈的长度可随意增加

堆栈(Strack)是指这样一段内存,它可以理解为一个筒结构,先放进筒中的数据被后放进筒中的数据“压住”,只有后放进筒中的数据都取出后,先放进去的数据才能被取出,称为“后进先出”。堆栈的长度可随意增加。堆栈结构可用链表实现。设计一个链表结构需包含两个成员:一个存放数据,一个为指向下一个节点的指针。当每次有一个新数据要放入堆栈时,称为“压入堆栈”,这时动态建立一个链表的节点,并连接到链表的结尾;当每次从堆栈中取出一个数据时,称为“弹出堆栈”,这意味着从链表的最后一个节点中取出该节点的数据成员,同时删除该节点,释放该节点所占的内存。


编程用链表方法实现堆栈数据结构。程序至少应该包含三个函数:


1、主函数 2、压栈操作:将5个数据依次压入堆栈

3、出栈操作:将5个数据依次弹出堆栈(注意:因为后进先出的原因,弹出时是逆序,另外,弹出后要删除该节点);


**输入提示:printf(“请输入要压栈的整数:”);

**输入格式:"%d"

**压栈后输出格示:“Push %dth Data:%d\n”

**出栈后输出格式:“Pop %dth Data:%d\n”


程序运行示例:

请输入要压栈的整数:1↙

Push 1th Data:1↙

请输入要压栈的整数:2↙

Push 2th Data:2↙

请输入要压栈的整数:3↙

Push 3th Data:3↙

请输入要压栈的整数:4↙

Push 4th Data:4↙

请输入要压栈的整数:5↙

Push 5th Data:5↙

Pop 5th Data:5↙

Pop 4th Data:4↙

Pop 3th Data:3↙

Pop 2th Data:2↙

Pop 1th Data:1↙


代码如下:


#include <stdio.h>
#include <stdlib.h>
typedef struct stack
{              
    int data;
    struct stack *next;
}               STACK;
STACK *head, *pr;
int nodeNum = 0;              /* 堆栈节点数寄存器 */
STACK *CreateNode(int num);
STACK *PushStack(int num);
int PopStack(void);
int main()
{              
    int pushNum[5] , popNum[5], i;
    for (i = 0; i < 5; i++)
    {              
        printf("请输入要压栈的整数:");
        scanf("%d",&pushNum[i]);
        PushStack(pushNum[i]);
        printf("Push %dth Data:%d\n", i + 1, pushNum[i]);
    }
    for (i = 0; i < 5; i++)
    {              
        popNum[i] = PopStack();
        printf("Pop %dth Data:%d\n", 5 - i, popNum[i]);
    }
    return 0;
}              
/* 函数功能:生成一个新的节点,并为该节点赋初值,返回指向新的节点的指针 */
STACK *CreateNode(int num)
{              
    STACK *p;
    p = (STACK *)malloc(sizeof(STACK));
    if (p == NULL)
    {              
        printf("No enough memory!\n");
        exit(0);
    }
    p->next = NULL;       /* 为新建的节点指针域赋空指针 */
    p->data = num;              /* 为新建的节点数据区赋值 */
    return p;
}              
/*  函数功能:将整型变量num的值压入堆栈,返回指向链表新节点的指针 */
STACK *PushStack(int num)
{              
    if (nodeNum == 0) /* 若为首节点,则保留该节点地址在head中*/
    {              
        head = CreateNode(num);
        pr = head;
        nodeNum++;  /* 堆栈节点数寄存器+1 */
    }
    else             /* 若不是首节点,则将新建节点连到链表的结尾处 */
    {              
        pr->next = CreateNode(num);
        pr = pr->next;
        nodeNum++;  /* 堆栈节点数寄存器+1 */
    }
    return pr;
}              
/*  函数功能:将当前栈顶的数据弹出堆栈,返回从堆栈中弹出的数据 */
int PopStack(void)
{              
    STACK *p = head;
    int result;
    for (;;)
    {              
        if (p->next == NULL)  /* 查找最后一个节点 */
        {              
            break;
        }
        else
        {              
            pr = p;         /* 记录最后一个节点的前一个节点的地址 */
            p = p->next;
            nodeNum--;        /* 堆栈节点数寄存器-1 */
        }
    }
    pr->next = NULL;           /* 将末节点的前一个节点置成末节点 */
    result = p->data;
    free(p);
    return result;
}
相关文章
|
6天前
|
消息中间件 存储 缓存
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
|
6月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
552 0
|
3月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
97 11
|
3月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
34 3
|
4月前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
109 14
|
4月前
|
存储 算法 Java
聊聊jvm的内存结构, 以及各种结构的作用
【10月更文挑战第27天】JVM(Java虚拟机)的内存结构主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。各部分协同工作,为Java程序提供高效稳定的内存管理和运行环境,确保程序的正常执行、数据存储和资源利用。
85 10
|
4月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
198 1
|
4月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
4月前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
541 1
|
4月前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
72 2