数据结构——栈和队列(C语言)

栈种常见的数据结构,它用来解决一些数据类型的问题,那么好,我来带着大家来学习一下栈

文章目录

    • 对栈的认识
    • 栈的模拟实现
    • 栈的练习
      • 方法一
      • 方法二

对栈的认识

栈(stack)是限定只能在表的一端进行插入删除操作的线性表

栈是一种先进后出的顺序结构,这里的先进后出就是先进来的数据要后出(跟没说一样)
就是1,2,3,4,5这五个数据,只能从5到1逐个访问。

数据结构栈的定义

栈顶:栈顶元素,最后一个入栈的元素
入栈
出栈
栈空:判断栈是否为空
栈的大小:返回站内元素个数

栈的模拟实现

在了解了栈之后,我们来对它进行简单的实现一下。
首先,我们应该先了解大框架,这里我们用数组的方式进行模拟实现(比较合适的方式,其他的也可以)

我们采用分模块的方式进行实现,这里,我在代码中会进行注释,可直接阅读代码来学习栈的实现。

stack.h用来声明各种头文件。
stack.c用来实现各个功能的实现包括入栈。 出栈等栈的基本功能。
test.h来测试代码功能

stack.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//栈可以村粗不同类型的数据,这里我们直接使用·typedef重定义类型
typedef int stdatetype;//用结构体来实现栈
typedef struct stack {int capacity;//capacity表示栈的容量int top;//栈顶元素int* a;//数组
}st;//st是重命名的结果//栈的初始化
void initst(st* pst);//栈的插入和删除
void pushback(st* pst,stdatetype x);void popback(st* pst);
void printst(st* pst);//返回栈顶元素
stdatetype sttop(st* pst);//返回栈内元素个数
int sizest(st* pst);//返回栈是否为空
bool empty(st* pst);//销毁栈
void destroy(st* pst);

stack.c

#include"stack.h"//初始化栈
void initst(st* pst)
{pst->top = -1;//top初始化为-1(这里也可以是零,但下面的代码也需要改动)//栈的容量pst->capacity = 0;//capacity可扩容pst->a = NULL;//对数组a进行制空
}//入栈
void pushback(st* pst,stdatetype x)
{assert(pst);//断言,以防止pst是一个空指针if ((pst->top + 1) == pst->capacity)//判断,如果top+1等于栈的容量的话,就要进行扩容{pst->capacity = pst->capacity == 0 ? 4 : pst->capacity * 2;stdatetype* tail = (stdatetype*)realloc(pst->a, sizeof(stdatetype)*pst->capacity);assert(tail);//断言一下,如果扩容失败,终止程序pst->a = tail;//扩容成功,把地址给a}pst->a[++(pst->top)] = x;//入栈
}//出栈
void popback(st* pst)
{assert(pst);//如果栈为空,终止程序assert(pst->top > -1);pst->top--;
}//返回栈顶元素
stdatetype sttop(st* pst)
{assert(pst);//栈为空终止程序assert(pst->top > -1);return pst->a[pst->top];//返回栈顶元素
}//返回栈的大小
int sizest(st* pst)
{assert(pst);return pst->top + 1;
}//判断栈是否为空
bool empty(st* pst)
{assert(pst);return pst->top == -1;//直接进行判断
}//销毁栈
void destroy(st* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = -1;pst->capacity = 0;}

test.c

#include"stack.h"int main()
{st s;initst(&s);pushback(&s, 1);pushback(&s, 2);pushback(&s, 3);printf("%d", sizest(&s));popback(&s);while (s.top > -1)printf("%d--", s.a[s.top--]);//因为栈的特点,要这样对栈进行打印if (empty(&s))printf("\n空");destroy(&s);return 0;
}

好了,栈是比较简单的数据结构,学习到这里,相信你也已经对栈有了一定的了解,

栈的练习

下面我们来做一道题,趁热打铁一下
https://leetcode.cn/problems/valid-parentheses/description/

在这里插入图片描述
这是这道题的要求
在这里插入图片描述

这道题就非常适合使用栈来解决,当我们学完C++之后,stl库的使用会让我们更轻松的解决这道题,但是我们这里也有解决方法,我们可以直接把上面的模拟实现,稍做修改拿来使用

这里我·提供两种方法(都可以通过)

方法一

下面是这道题的代码,大部分都是在实现栈,当我们学习过C++stl之后,这就会非常简单

bool isValid(char* s) {#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef char stdatetype;//用结构体来实现栈
typedef struct stack {int capacity;//capacity表示栈的容量int top;//栈顶元素stdatetype* a;//数组
}st;//st是重命名的结果void initst(st* pst)
{pst->top = -1;//top初始化为-1(这里也可以是零,但下面的代码也需要改动)//栈的容量pst->capacity = 0;//capacity可扩容pst->a = NULL;//对数组a进行制空
}//入栈
void pushback(st* pst,stdatetype x)
{assert(pst);//断言,以防止pst是一个空指针if ((pst->top + 1) == pst->capacity)//判断,如果top+1等于栈的容量的//话,就要进行扩容{int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;stdatetype* tail = (stdatetype*)realloc(pst->a, sizeof(stdatetype)*newcapacity);assert(tail);//断言一下,如果扩容失败,终止程序pst->a = tail;//扩容成功,把地址给apst->capacity=newcapacity;}pst->a[++(pst->top)] = x;//入栈
}//出栈
void popback(st* pst)
{assert(pst);//如果栈为空,终止程序assert(pst->top > -1);pst->top--;
}//返回栈顶元素
stdatetype sttop(st* pst)
{assert(pst);//栈为空终止程序assert(pst->top > -1);return pst->a[pst->top];//返回栈顶元素
}//返回栈的大小
int sizest(st* pst)
{assert(pst);return pst->top + 1;
}//判断栈是否为空
bool empty(st* pst)
{assert(pst);return pst->top == -1;//直接进行判断
}//销毁栈
void destroy(st* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = -1;pst->capacity = 0;}st _st;initst(&_st);while(*s){char ch=*s;if(ch=='{'||ch=='('||ch=='['){pushback(&_st,ch);}else{if(_st.top==-1){destroy(&_st);//防止内存泄露return false;}if((ch=='}'&&sttop(&_st)!='{')||(ch==')'&&sttop(&_st)!='(')||(ch==']'&&sttop(&_st)!='[')){destroy(&_st);return false;}popback(&_st);}s++;}if(!empty(&_st)){destroy(&_st);return false;}destroy(&_st);return true;
}

方法二

这样的实现过于麻烦,我们也有另一种方法,用数组快速的模拟栈
直接看代码吧

bool isValid(char* s) {const int N = 10010;int st[N];int hh=0;while(*s){char top=*s;if(top=='{'||top=='('||top=='['){st[hh++]=top;}else{if(hh==0)return false;if((top=='}'&&st[hh-1]!='{')||(top==')'&&st[hh-1]!='(')||(top==']'&&st[hh-1]!='[')){return false;}hh--;}s++;}if(hh){return false;}return true;
}

栈的学习就先到这里了,各位有什么不同见解可以说出来,一起交流一下

感谢观看,有错误请指出

在这里插入图片描述

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

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

相关文章

SpringCloud LoadBalancer

SpringCloud LoadBalancer 1.什么是LoadBalancer LoadBalancer&#xff08;负载均衡器&#xff09;是一种网络设备或软件机制&#xff0c;用于分发传入的网络流量负载请求到多个后端目标服务器上&#xff0c;从而实现系统资源的均衡利用和提高系统的可用性和性能。 负载均衡器…

【Tomcat与网络4】Tomcat的连接器设计

目录 1 如何设计一个灵活可靠的连接器 2 主要组件介绍 在上一篇&#xff0c;我们介绍了Tomcat提供服务的整体结构&#xff0c;本文我们一起来看一下Tomcat的连接器的设计。 在前面我们提到Tomcat主要完成两个功能&#xff1a; 处理 Socket 连接&#xff0c;负责网络字节流与…

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤&#xff1a; 开机&#xff0c;指示灯亮起后(需要灯闪烁3下后)&#xff0c;需在3s内&#xff08;超过3s则会正常启动&#xff09;&#xff0c;按一下按键&#xff08;注&#xff1a;切…

Springboot做查询数据库某个表的数据时,后台一切正常前台显示不了数据

当我在用springboot做项目的时候查询整个表的数据或者条件查询的时候发现我的后台功能一切正常但是我的前台界面就是显示不了数据&#xff0c;这个问题解决也很简单&#xff0c;就是需要我们平时多加注意&#xff0c;不要漏代码&#xff01;&#xff01;&#xff01; Builder …

Visual Studio 2022 打开“程序包管理器控制台”失败

Visual Studio 2022 打开“程序包管理器控制台”失败 昨天下午&#xff0c;正在用Visual studio 2022写代码&#xff0c;当使用EF core 做数据迁移时&#xff0c;需要用到“程序包管理器控制台”&#xff0c;打开失败&#xff0c;前一秒还好好的&#xff0c;怎么突然就用不了了…

互联网加竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

力扣136、只出现一次的数字(简单)

1 题目描述 图1 题目描述 2 题目解读 在非空整数数组nums中&#xff0c;有一个元素只出现了一次&#xff0c;其余元素均出现两次。要求找出那个只出现一次的元素。 3 解法一&#xff1a;位运算 位运算&#xff0c;是一种非常简便的方法。 3.1 解题思路 异或运算&#xff0c;有…

CPN故障诊断(MATLAB)

CPN(Colored Petri Net,彩色Petri网)是在传统Petri网的基础上进行扩展的高级Petri网。它在故障诊断领域有着广泛的应用。 CPN故障诊断的主要思想和步骤如下: 建模:根据系统的结构和功能,采用CPN构建系统的模型。将系统不同组件表示为网的位置,数据/信号流表示为网的转换,故障…

如何通过Hive/tez与Hadoop的整合快速实现大数据开发

一、Hive的功能 Hive是基于Hadoop的一个外围数据仓库分析组件&#xff0c;可以把Hive理解为一个数据仓库&#xff0c;但这和传统的数据库是有差别的。 传统数据库是面向业务存储&#xff0c;比如 OA、ERP 等系统使用的数据库&#xff0c;而数据仓库是为分析数据而设计的。同时…

4D毫米波雷达分类和工程实现

4D毫米波目标检测信息丰富&#xff0c;可获得目标3维位置信息、径向速度vr和rcs等&#xff0c;能够对目标准确分类。 4D毫米波和激光做好时空同步&#xff0c;可以用激光目标给4D毫米波做标注&#xff0c;提升标注效率。 1 激光用做4D毫米波分类真值 128线激光推理的结果作为4…

ChatGPT学python: 用json文件传参

目录 json语法最简陋版python解析语法小结 json语法最简陋版 param.json [{"Table_name": "table1","Event_name_colum": 4,"update_colum": 9},{"Table_name": "table2","Event_name_colum": 3,&quo…

Windows编程入门-窗口控件-资源操作

window控件&#xff1a; 控件是常见的窗口上的交互元素例如&#xff1a;一个按钮&#xff0c;一个复选框&#xff0c;一个列表框等。 当控件的特定功能被触发后&#xff0c;会主动发送消息通知父窗口&#xff0c;父窗口可以通过发送消息给控件控制控件的行为。 控件的本质是一个…

[AG32VF407]国产MCU+FPGA Verilog编写控制2路gpio输出不同频率方波实验

视频讲解 [AG32VF407]国产MCUFPGA Verilog编写控制2路gpio输出不同频率方波实验 实验过程 根据原理图&#xff0c;选择两个pin脚作为输出 修改VE文件&#xff0c;clk选择PIN_OSC&#xff0c;使用内部晶振8Mhz&#xff0c;gpio使用PIN_51和52&#xff0c;pinout是数组 添加pll…

Uniapp小程序端打包优化实践

背景描述&#xff1a; 在我们最近开发的一款基于uniapp的小程序项目中&#xff0c;随着功能的不断丰富和完善&#xff0c;发现小程序包体积逐渐增大&#xff0c;加载速度也受到了明显影响。为了提升用户体验&#xff0c;团队决定对小程序进行一系列打包优化。 项目优化点&…

CentOS 7如何修改用户密码

一、问题 CentOS 7如何修改用户密码&#xff1f; 二、解答 1、passwd命令 [rootlocalhost ~]# passwd 用户名#需要在root用户下修改 [rootlocalhost ~]# su root#切换到root下&#xff0c;输入密码 #修改用户的密码&#xff0c;按提示输入新密码和确认密码&#xff0c;密码是…

EPSON RC 机器人-第一个程序

创建项目 有机械人且用USB线连接好。可以USB。没有真机的选择 C4 Sample 可以运行程序。 否刚会提示【不能连接到控制器&#xff0c;未安装USB驱动器】 代码 按F5打开运行窗口 再点【开始】 点 【是】&#xff0c;查看运行结果

安装并开始设置 Windows 终端(命令提示符或Windows PowerShell或Azure Cloud Shell)

安装 安装 若要试用最新的预览功能&#xff0c;可能还需要安装 Windows 终端预览。 ‼️备注 如果你无法访问 Microsoft Store&#xff0c;GitHub 发布页上发布有内部版本。 如果从 GitHub 安装&#xff0c;Windows 终端将不会自动更新为新版本。 有关使用包管理器&#xff…

跟着cherno手搓游戏引擎【15】DrawCall的封装

目标&#xff1a; Application.cpp:把渲染循环里的glad代码封装成自己的类&#xff1a; #include"ytpch.h" #include "Application.h"#include"Log.h" #include "YOTO/Renderer/Renderer.h" #include"Input.h"namespace YO…

Android Studio使用小记

复制了一个原来的项目&#xff0c;准备基于它调整一个OEM版本 因为svn服务器上分出了一个单独的版本&#xff0c;于是在工程目录下手工删除了.svn文件&#xff0c;并手工去除了vcs.xml <?xml version"1.0" encoding"UTF-8"?> <project versi…

第4章 python深度学习——(波斯美女)

第4章 机器学习基础 本章包括以下内容&#xff1a; 除分类和回归之外的机器学习形式 评估机器学习模型的规范流程 为深度学习准备数据 特征工程 解决过拟合 处理机器学习问题的通用工作流程 学完第 3 章的三个实例&#xff0c;你应该已经知道如何用神经网络解决分类问题和回归…