栈和队列(1)

现在是个激动人心的时刻,因为我们来到了栈和队列的章节。

栈是一种特殊的线性表,只允许在一端进行插入和删除操作。进入数据插入和删除的一端叫作栈顶,另一端称为栈底。具有后进先出的特点。

压栈:数据的插入操作叫作进栈/入栈/压栈。

出栈:栈的删除操作叫作出栈,出栈也在栈顶。

栈的实现可以用数组或者线性表实现,相对而言,数组实现更优,因为数组在尾上插入的代价较小。

队列的表示和实现:

队列只允许在一端进行插入操作,在另一端进行删除操作。具有先进先出的特点。

入队列:进入插入操作的一端为队尾。

出队列:进行删除操作的一端为队头。

关于原地扩容和异地扩容:

异地扩容就是在新的地方开辟一个新的空间。

以上代码测试出如果是一样的,那么就是原地扩容,如果不一样,就是异地扩容。 

此时地址是一样的。但是当我们把扩容的空间增大,地址不一样。

数据都在内存里,在堆上。

不会直接访问数据。在缓存,就叫做缓存命中。如果不在缓存,就叫作不命中,要把数据从内存加载到缓存,再访问。

实现静态的栈:

#define N 10
struct Stack
{int a[N];
};

 动态的栈:

Stack.h

#pragma once
#include<stdio.h>
#innclude<stdlib.h>
#include<stdbool.h>
typedef int STDataType;
struct Stack
{STDataType* a;int top;int capacity;
}ST;void STInit(ST* pst);
void STDestory(ST* pst);
void STPush(ST* pst,STDataType x);
void STPop(ST* pst);
STDataType STTop(ST* pst);
bool STEmpty(ST* pst);
int STSize(ST* pst);

Stack.c

#include"Stack.h"
//初始化和销毁
void STInit(ST* pst)
{assert(pst);pst->a=NULL;pst->top=0;pst->capcity=0;
}void STDestory(ST* pst)
{assert(pst);free(pst->a); pst->top=pst->capacity=0;
}
//入栈 出栈
void STPush(ST* pst,STDataType x)
{assert(pst);//扩容if(pst->top==pst->capcity){int newCapcity=pst->capcity==0?4:pst->capcity*2;STDataType* tmp=realloc(pst->a,newCapcity*sizeof(STDataType));if(tmp==NULL){perror("realloc fail");return;}pst->a=tmp;pst->capcity=newCapcity; pst->a[pst->top]=x;pst->top++;
}
void STPop(ST* pst)
{assert(pst);pst->top--;
}
STDataType STTop(ST* pst)//获取栈顶元素
{assert(pst);assert(pst->top>0);return pst->a[pst->top-1];
}
bool STEmpty(ST* pst)
{assert(pst);return pst->top==0;
}
int STSize(ST* pst)
{assert(pst);return pst->top;
}
int main()
{ST s;STInit(&s);STPush(&s,1);STPush(&s,2);STPush(&s,3);while(!STEmpty(&s)){printf("%d ",STTop(&s);STPop(&s);}STDestory(&s);
}

 

 我们应该知道,top应该指向栈顶,还是栈顶的下一个元素呢?top等于0是有数据还是没数据呢。所以当栈里面没有元素的时候,top应该指向-1。

那么我们的初始化可以改成这样:

void STInit(ST* pst)
{assert(pst);pst->a=NULL;pst->top=0;//top指向栈顶数据的下一个位置
//top指向栈顶数据 pst->top=-1;pst->capcity=0;
}

20. 有效的括号 - 力扣(LeetCode)

第一步:左括号入栈,第二步:出栈顶的左括号判断和右括号是否匹配,如果匹配,继续,如果不匹配,终止。

bool isValid(char* s) {ST st;STInit(&st);while(*s){if(*s=='('||*s=='['||*s=='{')//左括号入栈{STPush(st,*s);}else//右括号取栈顶的左括号尝试匹配{if(STEmpty(&st)){return false;}char top=STTop(&st);STPop(&st);if((top=='('&&*s!=')')||(top=='{'&&*s!='}')(top=='('&&*s!=')'))//不匹配{return false;}}++s;}
//如果栈不为空,说明左括号比右括号多,数量不匹配bool ret=STEmpty(&st);STDestory(&st);return ret;
}

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

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

相关文章

InfiniGate自研网关实现五

17.核心通信组件管理和处理服务映射 引入模块api-gateway-core 到 api-gateway-assist 中进行创建和使用&#xff0c;并拉取自注册中心的映射信息注册到本地的网关通信组件中。 第17节是在第15节的基础上继续完善服务发现的相关功能&#xff0c;把从注册中心拉取的网关映射信…

fastjson1.2.68对于文件操作的分析最全

fastjson1.2.68对于文件操作的分析 前言分析复制文件写入文件读取文件分析poc拓宽场景极限环境poc优化修改再次优化poc的分析 前言 这次分析也是分析了很久&#xff0c;因为每个链子都是自己去跟着分析了的&#xff0c;然后主要是去学习了一下怎么去挖链子 分析 前面漏洞复现…

海外云手机的运作原理和适用场景

海外云手机是一种基于云计算技术的虚拟手机服务&#xff0c;通过将手机操作系统和应用程序托管在远程服务器上&#xff0c;实现用户可以通过互联网连接来使用和管理手机功能&#xff0c;而无需实际拥有物理手机。以下是有关海外云手机的相关信息&#xff1a; 海外云手机的运作原…

ASP.NET在线毕业论文提交系统的设计与实现

摘 要 本设计就很好的解决了上面的问题&#xff0c;它不但能实现毕业生论文的在线提交&#xff1b;还能给教师一定的权限&#xff0c;以在线的方式对自己指导的学生的论文进行审核&#xff1b;并且管理员还可以方便的将每个学生的论文信息按统一的论文排版本格式导出成word文…

Linux平台和Windows平台互传文件

rz和sz的出发对象都是从Linux出发的&#xff0c;例如sz发送&#xff08;Send&#xff09;从Linux->发送到Windows。 rz 从Windows文件发送到Linux中 先创立一个新文本文件 之后将hello Windows输入到该文本文件中 在显示器上显示里面是否有hello Windows内容 sz发送Lin…

消息队列选型

一、要解决的问题 1.1 异步 分析&#xff1a; 需要根据场景来判断。若整体链路的逻辑中&#xff0c;某些逻辑是不需要强实时的&#xff0c;滞后一段时间是允许的&#xff0c;同时又不会对用户带来不好的体验&#xff0c;那么可以使用MQ完成异步操作。 例如&#xff1a;秒杀场…

【RSGIS数据资源】2001-2021 年亚洲季风区主要国家作物种植制度数据集

文章目录 1. 数据集概况2. 数据格式3. 文件名命名规则4. 数据生产服务单位5. 元数据6. 数据引用与参考文献引用 1. 数据集概况 2001-2021 年亚洲季风区主要国家作物种植制度数据集&#xff08;ACIA500&#xff09;是结合MODIS 影像和现有的土地利用等多源数据&#xff0c;基于…

KNN算法处理多元分类任务

概述 这个案例还是基于之前的案例进行改造。 之前的案例代码完整如下&#xff1a; from sklearn.datasets import make_blobs # KNN 分类器 from sklearn.neighbors import KNeighborsClassifier # 画图工具 import matplotlib.pyplot as plt # 数据集拆分工具 from sklearn…

dubbo复习:(3) 服务超时时间配置

在dubbo admin中 可以进行类似如下配置 configVersion: v2.7 enabled: true configs:- side: consumeraddresses:- 0.0.0.0parameters:timeout: 55这样配置之后&#xff0c;当服务端响应超过55毫秒时&#xff0c;在服务消费者的控制台就会看到超时信息

Google Chrome GPU渲染抓包

非安全模式启动 "C:\Program Files\Google\Chrome\Application\chrome.exe" --ignore-certificate-errors --allow-running-insecure-content --disable-web-security 配置环境 set RENDERDOC_HOOK_EGL0 "C:/Program Files/Google/Chrome/Application/chrom…

降Compose十八掌之『亢龙有悔』

公众号「稀有猿诉」 原文链接 降Compose十八掌之『亢龙有悔』 Jetpack Compose是新一代的声明式的UI开发框架&#xff0c;由Google在2019年推出&#xff0c;最初是作为Android的新式UI开发框架&#xff0c;但它本质是一个声明式UI开发框架&#xff0c;并不受制于底层的平…

公司邮箱是什么?公司邮箱和个人邮箱有什么不同?

公司邮箱是企业用来收发邮件的专业版电子邮箱&#xff0c;不同于个人邮箱的简单功能和有限的存储空间&#xff0c;公司邮箱的功能更加丰富&#xff0c;能够满足企业的日常办公和协作需求。本文将为您详细讲解公司邮箱和个人邮箱的区别&#xff0c;以供您选择更适合自己的邮箱类…