C语言基础(二十四)

news2024/12/23 12:11:07

堆栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的数据结构。堆栈的主要操作包括压栈(Push)、弹栈(Pop)、查看栈顶元素(Peek/Top)等。C语言标准库并没有直接提供堆栈的实现,但可以使用数组或者链表手动实现堆栈。

测试代码1:

#include "date.h" 
#include <stdio.h>  
#include <stdlib.h>  
#include <stdbool.h>  
  
#define MAX_SIZE 100 // 定义堆栈的最大容量  
  
typedef struct {  
    int items[MAX_SIZE];  
    int top;  
} Stack;  
  
// 初始化堆栈  
void initStack(Stack *s) {  
    s->top = -1;  
}  
  
// 判断堆栈是否为空  
bool isEmpty(Stack *s) {  
    return s->top == -1;  
}  
  
// 判断堆栈是否已满  
bool isFull(Stack *s) {  
    return s->top == MAX_SIZE - 1;  
}  
  
// 入栈  
bool push(Stack *s, int item) {  
    if (isFull(s)) {  
        printf("Stack overflow\n");  
        return false;  
    }  
    s->items[++s->top] = item;  
    printf("Pushed: %d\n", item);  
    return true;  
}  
  
// 出栈  
bool pop(Stack *s, int *item) {  
    if (isEmpty(s)) {  
        printf("Stack underflow\n");  
        return false;  
    }  
    *item = s->items[s->top--];  
    printf("Popped: %d\n", *item);  
    return true;  
}  
  
// 查看栈顶元素  
bool peek(Stack *s, int *item) {  
    if (isEmpty(s)) {  
        printf("Stack is empty\n");  
        return false;  
    }  
    *item = s->items[s->top];  
    printf("Top element is: %d\n", *item);  
    return true;  
}  
  
int main() {  

    int time = getTime();
    Stack s;  
    initStack(&s);  
  
    // 入栈操作  
    push(&s, 50);  
    push(&s, 2);  
    push(&s, 30);  
    push(&s, 10); 
    push(&s, 88); 
    // 查看栈顶元素  
    int topElem;  
    peek(&s, &topElem);  
  
    // 出栈操作  
    int poppedElem;  
    while (!isEmpty(&s)) {  
        pop(&s, &poppedElem);  
    }  
  
    return 0;  
}

运行结果如下:

 

测试代码2:

#include "date.h"
#include <stdio.h>  
#include <stdlib.h>  
  
typedef struct Node {  
    int data;  
    struct Node* next;  
} Node;  
  
typedef struct {  
    Node* top;  
} Stack;  
  
// 初始化堆栈  
void initStack(Stack *s) {  
    s->top = NULL;  
}  
  
// 判断堆栈是否为空  
bool isEmpty(Stack *s) {  
    return s->top == NULL;  
}  
  
// 入栈  
void push(Stack *s, int item) {  
    Node* newNode = (Node*)malloc(sizeof(Node));  
    if (newNode == NULL) {  
        printf("Memory allocation failed\n");  
        exit(1); // 或者其他错误处理  
    }  
    newNode->data = item;  
    newNode->next = s->top;  
    s->top = newNode;  
    printf("Pushed: %d\n", item);  
}  
  
// 出栈  
bool pop(Stack *s, int *item) {  
    if (isEmpty(s)) {  
        printf("Stack is empty\n");  
        return false;  
    }  
    Node* temp = s->top;  
    *item = temp->data;  
    s->top = temp->next;  
    free(temp);  
    printf("Popped: %d\n", *item);  
    return true;  
}  
  
// 查看栈顶元素  
bool peek(Stack *s, int *item) {  
    if (isEmpty(s)) {  
        printf("Stack is empty\n");  
        return false;  
    }  
    *item = s->top->data;  
    printf("Top element is: %d\n", *item);  
    return true;  
}  
  
// 清理堆栈
void clearStack(Stack *s) {  
    Node* current = s->top;  
    Node* next;  
    while (current != NULL) {  
        next = current->next;  
        free(current);  
        current = next;  
    }  
    s->top = NULL;  
}  
  
int main() {  

    int time = getTime();
    Stack s;  
    initStack(&s);  
  
    // 入栈操作  
    push(&s, 11);  
    push(&s, 80);  
    push(&s, 35);  
    push(&s, 38);
    push(&s, 62);
    // 查看栈顶元素  
    int topElem;  
    peek(&s, &topElem);  
  
    // 出栈操作  
    int poppedElem;  
    while (!isEmpty(&s)) {  
        pop(&s, &poppedElem);  
    }  
  
    // 如果不再需要堆栈,应该调用clearStack释放内存 
	// clearStack(&s); 
    // 本例中,程序将在main函数结束时自动结束,操作系统会回收所有内存。 
  
    return 0;  
}

运行结果如下:

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt折线图,x轴是时间,y轴是int

头文件 #include <QWidget> #include <QTimer> #include <QtCharts/QChartView>//显示图表 #include <QtCharts/QLineSeries>//线系列 #include <QtCharts/QSplineSeries> #include <QtCharts/QValueAxis> #include <QDateTime> #i…

[RIS]GRES: Generalized Referring Expression Segmentation

1. BaseInfo TitleGRES: Generalized Referring Expression SegmentationAdresshttps://arxiv.org/pdf/2306.00968Journal/TimeCVPR2023Author南洋理工Codehttps://github.com/henghuiding/ReLARead20240829TableVisonLanguage 2. Creative Q&A 考虑结果多目标和无目标&…

skywalking接入nginx

下载Nginx的插件 GitHub - apache/skywalking-nginx-lua: The Nginx Lua agent for Apache SkyWalking ~]# cd skywalking-nginx-lua-master/ skywalking-nginx-lua-master]# ls CHANGES.md examples lib LICENSE licenses Makefile mvnw NOTICE README.md RELEASING…

苹果手机系统修复如何操作,几种iOS系统修复办法分享

苹果手机作为市场上的热门产品&#xff0c;其系统稳定性和用户体验一直备受赞誉。然而&#xff0c;即使是如此优秀的系统&#xff0c;也难免会遇到一些问题&#xff0c;如系统崩溃、应用闪退、无限重启等。当这些问题出现时&#xff0c;如何进行系统修复成为了许多用户关心的问…

@antv/x6 自定义节点Safari兼容问题处理

背景 为什么选择antv/x6&#xff1f; 由于x6提供了一套强大友好的流程图API&#xff0c;并且支持使用 React、Vue 组件来渲染节点。这样可以使用组件开发的方式去快速完成卡片开发&#xff0c;并实现更加复杂的业务逻辑。遇到了Safari的兼容问题 由于x6自定义节点基于SVG fore…

Milvus向量数据库-数据备份与恢复

前言 随着Milvus版本的持续迭代&#xff0c;越来越多的用户将其作为构建生产环境的向量数据服务使用。作为数据服务使用&#xff0c;其中的运维、数据安全、容灾备份自然是用户最关心且不容有失的需求。为解决这一需求&#xff0c;Milvus-backup项目工具应运而生。 Milvus-ba…

docker实战演练

一.docker简介 二.docker部署 1.解压并安装所需要的软件 [rootdocker-node1 ~]# ls anaconda-ks.cfg docker.tar.gz mario.tar.gz busybox-latest.tar.gz game2048.tar.gz nginx-latest.tar.gz [rootdocker-node1 ~]# tar zxf docker.tar.gz [rootdocker-node1 …

cad转换dxf怎么转换?学会这5种方法轻松解决cad难题

在CAD领域中&#xff0c;DXF格式因其良好的兼容性和广泛的应用&#xff0c;成为了许多设计师和工程师的首选交换格式。然而&#xff0c;CAD文件很多默认的都是dwg格式&#xff0c;那么如何将CAD文件转换为DXF格式&#xff0c;很多小伙伴不是很清楚&#xff0c;下面给大家分享5种…

想学gis开发,java和c++哪个比较好?

java与C的应用场景不同&#xff0c;究竟选择谁&#xff0c;应该由开发者的兴趣方向来决定。 你选择Java&#xff0c;意味着以后的业务方向就是偏后台服务开发&#xff0c;如果你非得说我用java也可以写界面&#xff0c;对不起&#xff0c;别人不会。不管是从项目还是产品的角度…

Element-plus组件库基础组件使用

文章目录 按钮图标输入框表格表单对话框文件上传布局容器ElMessage消息提示MessageBox 消息提示框Pagination分页样式表单校验 记录vue3项目使用element-Plus&#xff0c;开发中常用的一些样式 下面这些组件是写增删改查是经常用到的&#xff0c;学习了这个写增删改查会好很多。…

DBpedia——利用维基百科信源构造语义知识库

1. 简介 DBpedia 从维基百科(Wikipedia)的词条里撷取出结构化的信息&#xff0c;以强化维基百科的搜寻功能&#xff0c;同时还提供复杂信息的检索功能&#xff0c;并将其他资料集连结至维基百科。通过这样的语义化技术的介入&#xff0c;让维基百科的庞杂资讯有了许多创新而有趣…

iview checkbox单独使用时 如何去掉显示的true和false以及不显示文字

如图所有 当在表格显示中想单独使用checkbox的时候&#xff0c;只想显示勾选 不显示文字这样写&#xff0c;分别用2个参数true/false来显示勾选和不勾选&#xff0c;再在外层用参数控制就好啦&#xff0c;是不是很简单呢&#xff01;

各行各业的都有的文档推荐

如果你在寻找一个丰富多样、几乎能满足任何阅读需求的电子书下载的地方&#xff0c;不妨考虑“literalink.top”网站。它不仅涵盖了广泛的书籍种类&#xff0c;从经典文学到最新畅销书应有尽有&#xff0c;还提供了多本不同版本和译本的选择&#xff0c;超越了许多其他网站的资…

GaussDB 24.1.30 分布式3节点命令行方式部署

目录 GaussDB介绍 服务器环境 安装前准备 配置会话不中断 操作系统配置 关闭防火墙并禁止开机启动 设置时区和时间 检查时区和时间 java版本 expect root密码一致 root用户ssh连通性 上传软件包和安装脚本 安装脚本配置 修改 install_cluster.json 配置文件 安装…

2024最新最全面的JMeter 做接口加密测试

JMeter 怎么做接口的加密&#xff1f; JMeter如果需要做加密测试&#xff0c;是需要加密类型对应的jar包的。本文以MD5,加密作为教程。 1、在Test Plan 引用jar包&#xff1b; 2、添加BeanShell Sampler取样器&#xff0c;并输入调用代码 import md5.mymd5;//调用jar包 String…

使用kafka完成数据的实时同步,同步到es中。(使用kafka实现自动上下架 upper、lower)

文章目录 1、发送消息 KafkaService2、生产者 service-album -> AlbumInfoServiceImpl2.1、新增 saveAlbumInfo()2.2、更新 updateAlbumInfo()2.3、删除 removeAlbumInfo() 3、消费者 service-search - > AlbumListener.java 上架&#xff1a;新增专辑到 es下架&#xff…

信息学奥赛初赛天天练-78-NOIP2015普及组-基础题3-中断、计算机病毒、文件传输协议FTP、线性表、链式存储、栈

NOIP 2015 普及组 基础题3 8 所谓的“中断”是指( ) A 操作系统随意停止一个程序的运行 B 当出现需要时&#xff0c;CPU 暂时停止当前程序的执行转而执行处理新情况的过程 C 因停机而停止一个程序的运行 D 电脑死机 9 计算机病毒是( ) A 通过计算机传播的危害人体健康的一种病…

有什么还原空白试卷的免费软件?2024快速进行空白还原的软件

有什么还原空白试卷的免费软件&#xff1f;2024快速进行空白还原的软件 还原空白试卷通常是指将已经填写的试卷还原为未填写的空白版本&#xff0c;以便重复使用或进行其他用途。以下是五款可以帮助你快速还原空白试卷的免费软件&#xff0c;这些工具提供了不同的功能&#xf…

补录.day43动态规划

300.最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序…

【RNN】循环神经网络RNN学习笔记

时间序列任务场景&#xff1a; 语音识别生成一段音乐情感分析DNA序列分析机器翻译 如何理解时间序列&#xff1a;特点&#xff1a;前后关联强&#xff0c;前因后果&#xff0c;后面产生的结果依赖于之前的结果 标准神经网络建模的弊端&#xff1a; 输入和输出在不同例子中可…