数据结构——栈

1、栈的概念

(1)是一种特殊的线性表,只能在一端进行插入或删除操作
(2)逻辑结构:线性结构;存储结构:既可以是顺序存储,也可以是链式存储
(3)栈顶:允许插入或删除的一端
(4)栈底:不允许插入或删除的一端,位置固定不变
(5)空栈:栈中没有元素
(6)使用特点:LIFO(后进先出

2、操作

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>

#define STACK_MAX_COUNT  20

//大小:栈中元素的个数
//常用操作:创建、销毁(清0)、压栈(进栈)、弹栈(出栈)、判断空、遍历栈
//创建方式:顺序存储->顺序栈(数组创建、指针创建),链式存储->链栈

//如果操作要修改结构体变量,并使其有效,传地址;否则,传值

//顺序栈   数组创建方式
typedef int elementType;
typedef struct Stack_List {
    elementType data[STACK_MAX_COUNT];  //存储栈的元素
    int botom;  //栈底元素索引
    int top;  //栈顶元素索引
}Stack;

void printf_menu();
void Init_Stack(Stack* s);
int is_empty(Stack s);
void push_Stack(Stack* s, elementType val);
void pop_Stack(Stack* s);
void ptint_Stack(Stack s);
void clear_Stack(Stack* s);

int main() {
    printf_menu();
    Stack s;  //定义栈变量
    int order = 0;
    int flage = 0;
    elementType val;
    while (1) {
        printf("请输入操作指令:");
        scanf(" %d", &order);
        switch(order) {
            case 0:  //初始化栈
                Init_Stack(&s);
                break;
            case 1:  //判断栈是否为空
                flage = is_empty(s);
                flage ? printf("空栈!\n") : printf("不是空栈!\n");
                break;
            case 2:  //进栈(压栈)
                printf("请输入要压栈的元素:");
                scanf(" %d", &val);
                push_Stack(&s, val);
                break;
            case 3:  //出栈(弹栈),弹出栈顶元素
                  //思路:把栈顶元素删除,并打印出来即可
                pop_Stack(&s);
                break;
            case 4:  //遍历栈
                ptint_Stack(s);
                break;
            case 5:  //清栈
                  //逻辑:不改变栈顶和栈底元素的位置,只是栈中元素全部置0
                clear_Stack(&s);
                break;
            case 6:  //退出
                return;
            default:
                printf("输入错误!\n");
        }
    }
    return 0;
}

void printf_menu() {
    printf("操作指令如下:\n");
    printf("0----初始化栈\n");
    printf("1----判断栈是否为空\n");
    printf("2----进栈(压栈)\n");
    printf("3----出栈(弹栈)弹出栈顶元素\n");
    printf("4----遍历栈\n");
    printf("5----清栈,将栈中元素全部置0\n");
    printf("6---退出\n");
    printf("**************************************\n");
}

//初始化栈——空栈
//特点:top==-1  botom==-1
void Init_Stack(Stack* s) {
    assert(s);
    //将栈顶和栈底指针均置为-1,此时表示为一个空栈
    s->botom = -1; 
    s->top = -1;

    printf("初始化成功!\n");
}

//判断栈是否为空
int is_empty(Stack s) {
    //if (s.top == -1) {  //空栈
    //    return 1;
    //}else {
    //    return 0;
    //}

    //优化
    return s.top == -1;
}

//进栈(压栈)
void push_Stack(Stack* s, elementType val) {
    //栈是否满
    if (s->top >= STACK_MAX_COUNT - 1) {
        printf("栈已满,无法压栈!\n");
        return;
    }
    //压栈之前,栈是否空
    if (s->top == -1) {  //或者把条件改为is_empty(*s)
        //空栈
        s->botom = 0;
    }
    s->top++;
    s->data[s->top] = val;
    printf("压栈成功!\n");
}

//出栈(弹栈),弹出栈顶元素
void pop_Stack(Stack* s) {
    //判断是否是空栈
    if (s->top == -1) {  //或者把条件改为is_empty(*s)
        //空栈
        printf("空栈,无法弹栈!\n");
        return;
    }
    //弹栈之前,判断栈内是否只有一个元素
    elementType topele = s->data[s->top];  //先把栈顶元素保存
    if (s->top == 0) {  //栈内只有一个元素
        s->botom = -1;
    }
    s->top--;
    printf("弹出的栈顶元素为:%d\n", topele);
}

//遍历栈
void ptint_Stack(Stack s) {
    //判断是否是空栈
    if (s.top == -1) {  //或者把条件改为is_empty(*s)
        //空栈
        printf("空栈,无法弹栈!\n");
        return;
    }
    for (int i = s.botom;i <= s.top;i++) {
        printf("%d ", s.data[i]);
    }
    printf("\n");
}

//清栈
//逻辑:不改变栈顶和栈底元素的位置,只是栈中元素全部置0
void clear_Stack(Stack* s) {
    //判断是否是空栈
    if (s->top == -1) {  //或者把条件改为is_empty(*s)
        //空栈
        printf("空栈,无法弹栈!\n");
        return;
    }
    for (int i = s->botom;i <= s->top;i++) {
        s->data[i] = 0;
    }
    printf("清栈成功!\n");
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3使用音频audio标签

文章目录 一、背景二、页面三、标签介绍四、代码五、代码说明场景1&#xff1a;针对加载固定格式的比如MP3文件&#xff0c;可直接使用\<audio>标签场景2&#xff1a;针对播放告警内容&#xff0c;比如中文或者英文词条情况 一、背景 项目使用vue3&#xff0c;需求针对告…

工业制造离不开的BOM

在制造业的浩瀚星空中&#xff0c;物料清单&#xff08;BOM&#xff09;犹如“北极星”&#xff0c;牢牢指引着产品从设计蓝图迈向实物诞生的全过程。 BOM的分类 按照设计制造的不同阶段&#xff0c;将BOM划分为设计BOM、工艺BOM、制造BOM三种类型。 设计BOM Engineering BO…

【Python】循环语句

while 基本语法格式 while 条件:循环体条件为真, 则执行循环体代码.条件为假, 则结束循环 num 1 while num < 10 :print(num)num 1注&#xff1a; 在 print 函数中&#xff0c;可以使用 end 参数来指定输出结束时使用的字符。默认情况下&#xff0c;end 参数的值为 &qu…

TOSUN同星TsMaster使用入门——3、使用系统变量及c小程序结合panel面板发送报文

本篇内容将介绍TsMaster中常用的Panel面板控件以及使用Panel控件通过系统变量以及c小程序来修改信号的值&#xff0c;控制报文的发送等。 目录 一、常用的Panel控件介绍 1.1系统——启动停止按钮 1.2 显示控件——文本框 1.3 显示控件——分组框 1.4 读写控件——按钮 1.…

LeetCode:37. 解数独

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff…

PyTorch使用教程(10)-torchinfo.summary网络结构可视化详细说明

1、基本介绍 torchinfo是一个为PyTorch用户量身定做的开源工具&#xff0c;其核心功能之一是summary函数。这个函数旨在简化模型的开发与调试流程&#xff0c;让模型架构一目了然。通过torchinfo的summary函数&#xff0c;用户可以快速获取模型的详细结构和统计信息&#xff0…

【22】Word:小李-高新技术企业政策❗

目录 题目​ NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在删除空白行等要求&#xff0c;可以到最后来完成。注意最后一定要检查此部分&#xff01;注意&#xff1a;大多是和事例一样即可&#xff0c;不用一摸一样&#xff0c;但也不要差太多。 题目 NO1.2 F12Fn&a…

TDengine 做 Apache SuperSet 数据源

‌Apache Superset‌ 是一个现代的企业级商业智能&#xff08;BI&#xff09;Web 应用程序&#xff0c;主要用于数据探索和可视化。它由 Apache 软件基金会支持&#xff0c;是一个开源项目&#xff0c;它拥有活跃的社区和丰富的生态系统。Apache Superset 提供了直观的用户界面…

Python----Python高级(文件操作open,os模块对于文件操作,shutil模块 )

一、文件处理 1.1、文件操作的重要性和应用场景 1.1.1、重要性 数据持久化&#xff1a; 文件是存储数据的一种非常基本且重要的方式。通过文件&#xff0c;我们可 以将程序运行时产生的数据永久保存下来&#xff0c;以便将来使用。 跨平台兼容性&#xff1a; 文件是一种通用…

STM32单片机:GPIO模式

GPIO有八种工作模式&#xff0c;分别是推挽输出、开漏输出、复合推挽输出、复合开漏输出、模拟输入、上拉输入、下拉输入、浮空输入。 在了解这些之前&#xff0c;我们先来看一下GPIO口内部的结构&#xff1a; I/O引脚一般工作电压为3.3V&#xff0c;在它边的两个二极管起到保…

[Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器

目录 前言&#xff1a;Qt与操作系统的关系 一、Qt事件 1.事件介绍 2.事件的表现形式 常见的Qt事件&#xff1a; 常见的事件描述: 3.事件的处理方式 处理鼠标进入和离开事件案例 控件添加到对象树底层原理 二、鼠标事件 1.鼠标按下和释放事件&#xff08;单击&#x…

Linux下MySQL的简单使用

Linux下MySQL的简单使用 导语MySQL安装与配置 MySQL安装密码设置 MySQL管理 命令 myisamchkmysql其他 常见操作 C语言访问MYSQL 连接例程错误处理使用SQL 总结参考文献 导语 这一章是MySQL的使用&#xff0c;一些常用的MySQL语句属于本科阶段内容&#xff0c;然后是C语言和M…

ElasticSearch索引别名的应用

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview Elasticsearch 索引别名是一种极为灵活且强大的功能&#xff0c;它允许用户为一个或多个索引创建逻辑上…

火狐浏览器Firefox一些配置

没想到还会开这个…都是Ubuntu的错 一些个人习惯吧 标签页设置 常规-标签页 1.按最近使用顺序切换标签页 2.打开新标签而非新窗口&#xff08;讨厌好多窗口&#xff09; 3.打开新链接不直接切换过去&#xff08;很打断思路诶&#xff09; 4.关闭多个标签页时不向我确认 启动…

数据结构-队列

目录 前言一、队列及其抽象数据类型1.1 队列的基本概念1.2 队列的抽象数据类型 二、队列的实现2.1 顺序表示2.1.1 结构定义2.1.2 基本操作的实现 2.2 链式表示2.2.1 结构定义2.2.2 基本操作的实现 总结 前言 本篇文章介绍队列的基础知识&#xff0c;包括队列的抽象数据类型以及…

STM32-串口-UART-Asynchronous

一&#xff0c;发送数据 #include "stdio.h" uint8_t hello[]"Hello,blocking\r\n"; HAL_UART_Transmit(&huart1,hello,sizeof(hello),500); 二&#xff0c;MicroLIB-printf(" hello\r\n") #include "stdio.h" #ifdef __GNUC…

深度学习 DAY2:Transformer(一部分)

前言 Transformer是一种用于自然语言处理&#xff08;NLP&#xff09;和其他序列到序列&#xff08;sequence-to-sequence&#xff09;任务的深度学习模型架构&#xff0c;它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制&#xff08;self-attention mech…

《目标检测数据集下载地址》

一、引言 在计算机视觉的广袤领域中&#xff0c;目标检测宛如一颗璀璨的明星&#xff0c;占据着举足轻重的地位。它宛如赋予计算机一双锐利的 “眼睛”&#xff0c;使其能够精准识别图像或视频中的各类目标&#xff0c;并确定其位置&#xff0c;以边界框的形式清晰呈现。这项技…

题解 CodeForces 1037D Valid BFS? 三种解法 C++

题目传送门 Problem - 1037D - Codeforceshttps://codeforces.com/problemset/problem/1037/Dhttps://codeforces.com/problemset/problem/1037/Dhttps://codeforces.com/problemset/problem/1037/Dhttps://codeforces.com/problemset/problem/1037/Dhttps://codeforces.com/p…

2024微短剧行业生态洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39072 本报告合集洞察从多个维度全面解读微短剧行业。在行业发展层面&#xff0c;市场规模与用户规模双增长&#xff0c;创造大量高收入就业岗位并带动产业链升级。内容创作上&#xff0c;精品化、品牌化趋势凸显&#xff0c;题材走…