当前位置: 首页 > news >正文

03-数据结构-栈与队列

1.栈

77a8072800534dd1b6072ce98752205d.png

栈和队列是两种操作受限的线性表。如上图所示显示栈的结构

栈:先进后出,入栈(数据进入) 和出栈(数据出去)均在栈顶操作。

常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现

1.1 栈的代码实现

#include<iostream>
#include<stdio.h>
#include<malloc.h>
#include<assert.h>typedef int STDataType;
typedef struct node
{STDataType x;struct node* next;
}node;
typedef struct Stack
{node* head;int nums;		// 长度
}Stack;// 初始化栈 
void StackInit(Stack* ps)
{assert(ps);ps->head = NULL;ps->nums = 0;
}// 入栈 
void StackPush(Stack* ps, STDataType data)
{assert(ps);node* new_node = (node*)malloc(sizeof(node));new_node->x = data;new_node->next = ps->head;ps->head = new_node;ps->nums++;
}// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{assert(ps);return ps->nums == 0;
}// 出栈 
STDataType StackPop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));STDataType ret = ps->head->x;node* del = ps->head;ps->head = ps->head->next;free(del);ps->nums--;return ret;
}// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{assert(ps);return ps->nums;
}// 销毁栈 
void StackDestroy(Stack* ps)
{assert(ps);node* tmp = ps->head;while (tmp){ps->head = ps->head->next;free(tmp);tmp = ps->head;}ps->head = NULL;ps->nums = 0;
}int main()
{Stack sta;StackInit(&sta);StackPush(&sta, 1);StackPush(&sta, 2);StackPush(&sta, 3);StackPush(&sta, 4);StackPush(&sta, 5);std::cout << StackSize(&sta) << std::endl;while (!StackEmpty(&sta)){printf("%d\n", StackPop(&sta));}
}

1.2 进制转化

#include <iostream>
#include <malloc.h>using namespace std;/**** 结 构 体 声 明 ****/
typedef struct scStack{struct scStack *next;int elem;
}scStack;/*余数入栈
*/
scStack *push(scStack *stack,int elem){scStack *newStack = (scStack *)malloc(sizeof(scStack));newStack->elem = elem;newStack->next = stack;stack = newStack;return stack;
}/*进制转换
*/
scStack *sysConvert(int num,int system,scStack *sys){while(num > 0){sys = push(sys,num % system);num /= system;}return sys;   //返回栈顶
}/*余数出栈
*/
void pop(scStack *stack){while(stack){scStack *top = stack;top->elem >= 10 ? printf("%c",top->elem + 'a' - 10) : printf("%d",top->elem);stack = stack->next;free(top);}cout<<endl<<"转换完毕!"<<endl;
}/*主函数
*/
int main(){scStack *stack = NULL; //初始化栈int num,system;cout<<"请输入一个10进制数:";cin>>num;cout<<"请输入想要转换为多少进制:";cin>>system;stack = sysConvert(num,system,stack);pop(stack);return 0;
}

1.3 括号匹配

#include<stdio.h>#define MaxSize 10typedef struct {    // 定义顺序栈int data[MaxSize];  // 静态数组存放栈中元素int top;    // 栈顶指针:指向目前栈顶元素的位置
} SeqStack;void InitStack(SeqStack &S) {S.top = -1;
}bool StackEmpty(SeqStack S) {if(S.top == -1) {return true;} else {return false;}
}bool Push(SeqStack &S, char x) {if(S.top == MaxSize - 1) {return false;}S.top = S.top + 1;S.data[S.top] = x;return true;
}bool Pop(SeqStack &S, char &x) {if(S.top == -1) {return false;}x = S.data[S.top];S.top = S.top - 1;return true;
}bool bracketCheck(char str[], int length) {SeqStack S;InitStack(S);for(int i = 0;i < length;i++) {if(str[i] == '(' || str[i] == '[' || str[i] == '{') {Push(S, str[i]);} else {if(StackEmpty(S)) {return false;}char topElem;Pop(S, topElem);if(str[i] == ')' && topElem != '(') {return false;}if(str[i] == ']' && topElem != '[') {return false;}if(str[i] == '}' && topElem != '{') {return false;}}}return StackEmpty(S);
}int main() {char A[] = "[([][])]";if(bracketCheck(A, 8)) {printf("A The match is successful\n");}else{printf("A The match is faild\n");}char B[] = "[([][]]";if(bracketCheck(B, 8)) {printf("B The match is successful\n");}else{printf("B The match is faild\n");}
}

1.4 递归

//X有n个盘子,从上到下有从小到大的顺序,有三个柱子X,Y, Z,把n个盘子从X移到Z,
//Y为辅助,并在移动过程中有一个约束条件就是大盘永远不能在小盘上面。
//
#include <stdio.h>
#include <stdlib.h>#define MAXSIZE 100typedef int ElemType;//盘子的结构
typedef struct//柱子(栈)的结构
{char name;ElemType* base;ElemType* top;
}StackType;int initstack(StackType* s,char name)
{s->name=name;s->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));if(s->base==NULL)exit(0);s->top=s->base;return 1;}int push(StackType* s,ElemType e)
{if(s->top-s->base>=MAXSIZE)exit(0);*(s->top)=e;s->top++;return 1;
}ElemType pop(StackType* s)
{if(s->top==s->base)exit(0);s->top--;return *(s->top);
}int main()
{int all;int i;StackType X;StackType Y;StackType Z;initstack(&X,'X');initstack(&Y,'Y');initstack(&Z,'Z');while(1){printf("请输入X柱子开始有多少个盘子\n");scanf("%d",&all);for(i=all;i>0;i--){push(&X,i);}hannota(all,&X,&Y,&Z);}return 1;
}int hannota(int n,StackType* x,StackType* y,StackType* z)
{if(1==n){move(x,z);printf("from %c to %c\n",x->name,z->name);return 1;}hannota(n-1,x,z,y);//先解决n-1个盘子移到辅助柱子Y的汉洛塔问题move(x,z);//最后一个从x移到Zprintf("from %c to %c\n",x->name,z->name);hannota(n-1,y,x,z);//解决n-1个盘子移到柱子z的汉洛塔问题return 1;
}int move(StackType* s1,StackType* s2)
{ElemType temp;temp=pop(s1);push(s2,temp);return 1;
}

2.队列

队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。

队列是先进先出,如上图所示,队列从队尾入队,从队头出队。队列有顺序队列,链队列和循环队列

2.1 链队列的代码实现

#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct DataNode
{	ElemType data;struct DataNode *next;
} DataNode;				//链队数据结点类型
typedef struct
{	DataNode *front;DataNode *rear;
} LinkQuNode;			//链队类型
void InitQueue(LinkQuNode *&q)
{	q=(LinkQuNode *)malloc(sizeof(LinkQuNode));q->front=q->rear=NULL;
}
void DestroyQueue(LinkQuNode *&q)
{DataNode *p=q->front,*r;//p指向队头数据结点if (p!=NULL)			//释放数据结点占用空间{	r=p->next;while (r!=NULL){	free(p);p=r;r=p->next;}}free(p);free(q);				//释放链队结点占用空间
}
bool QueueEmpty(LinkQuNode *q)
{return(q->rear==NULL);
}
void enQueue(LinkQuNode *&q,ElemType e)
{	DataNode *p;p=(DataNode *)malloc(sizeof(DataNode));p->data=e;p->next=NULL;if (q->rear==NULL)		//若链队为空,则新结点是队首结点又是队尾结点q->front=q->rear=p;else{	q->rear->next=p;	//将p结点链到队尾,并将rear指向它q->rear=p;}
}
bool deQueue(LinkQuNode *&q,ElemType &e)
{	DataNode *t;if (q->rear==NULL)		//队列为空return false;t=q->front;				//t指向第一个数据结点if (q->front==q->rear)  //队列中只有一个结点时q->front=q->rear=NULL;else					//队列中有多个结点时q->front=q->front->next;e=t->data;free(t);return true;
}
int main()
{LinkQuNode *q;     //创建队列q  ElemType e;InitQueue(q);   //初始化队enQueue(q,'a');enQueue(q,'b');enQueue(q,'c'); //依次进队a,b,cdeQueue(q,e);printf("%c\n",e);   //出队元素a deQueue(q,e);printf("%c\n",e);  //出队元素b deQueue(q,e);printf("%c\n",e);  //出队元素cDestroyQueue(q);  //销毁队 return 0; 
} 

相关文章:

03-数据结构-栈与队列

1.栈 栈和队列是两种操作受限的线性表。如上图所示显示栈的结构 栈&#xff1a;先进后出&#xff0c;入栈&#xff08;数据进入&#xff09; 和出栈&#xff08;数据出去&#xff09;均在栈顶操作。 常见栈的应用场景包括括号问题的求解&#xff0c;表达式的转换和求值&#…...

功能测试转向自动化测试 。10 年 心路历程——愿测试人不再迷茫

十年测试心路历程&#xff1a; 由于历史原因&#xff0c;大部分测试人员&#xff0c;最开始接触都是纯功能界面测试&#xff0c;随着工作年限&#xff0c;会接触到一些常用测试工具&#xff0c;比如抓包&#xff0c;数据库&#xff0c;linux 等。 我大学学的计算机专业&#…...

VIM ——Vimtutor 个人总结【从入门到精通】

精进 Vim 编辑器技能&#xff1a;从入门到精通 文章目录 精进 Vim 编辑器技能&#xff1a;从入门到精通学习资源[Vim 自带教程中文版 —— vimtutor-CSDN博客](https://blog.csdn.net/qq_40395874/article/details/116047253)[Learn Vimscript the Hard Way (stevelosh.com)](h…...

gitea分支、合并

一、创建分支&#xff0c;推送到远程仓库 git branch dev git checkout dev 或者可以使用合并的命令来完成上述两个步骤&#xff1a; git checkout -b dev在新分支上进行修改、提交代码等操作 接下来&#xff0c;将新分支推送到远程仓库。使用git push命令&#xff0c;并…...

探究 JavaScript 类型检查的利器:typeof 和 instanceof

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

VSCode报错插件Error lens

1.点击左侧扩展图标→搜索“error lens”→点击“安装” 2.安装成功页面如下&#xff1a; 3.代码测试一下&#xff1a;书写代码的过程中会出现红色提醒或红色报错 4.另外推荐小伙伴们安装中文插件&#xff0c;学习过程中会比较实用方便&#xff0c;需要安装中文插件的小伙伴请点…...

go-zero开发入门之gateway深入研究1

创建一个 gateway 示例&#xff1a; // main.go package mainimport ("flag""fmt""gateway/middleware""github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/gateway" )var configFile flag.String(&…...

【每日一题】反转二叉树的奇数层

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;广度优先搜索方法二&#xff1a;深度优先搜索 写在最后 Tag 【深度优先搜索】【广度优先搜索】【二叉树】【2023-12-15】 题目来源 2415. 反转二叉树的奇数层 题目解读 反转二叉树奇数层的节点。 解题思路 对于二叉…...

vue 项目配置反向代理导致项目白屏

问题&#xff1a;vue 项目配置反向代理导致项目白屏 一、现象描述 添加反向代理代码后&#xff0c;前端运行白屏 // 设置baseURL&#xff0c;8888是后端端口号&#xff0c;前端请求默认发送到baseURL的地址 var axios require(axios) axios.defaults.baseURL http://local…...

全国县级行政区点位数据,Shp+excel格式

基本信息. 数据名称: 县级行政区点位 数据格式: Shpexcel 数据时间: 2021年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1xzqhdm_1省代码2xzqhmc_1省名称3xzqhdm_2市代码4xzqhmc_2市代…...

文件包含的提升刷题

上一篇文章&#xff1a;一篇文章带你入门文件包含-CSDN博客 已经开始入门了文件包含&#xff0c;那现在开始拔高提升刷题&#xff01; 1. 拿到题目后啥也没有&#xff0c;所以也不知道要读取啥文件&#xff0c;那就查看源代码。 直接看if的条件就可以知道一定要设置cookie&a…...

入门级银行测试岗位招聘,只需具备这些基本条件!

2023年应该说是超乎意外的寒冷&#xff0c;几乎算是百业凋零。充斥在各个地方各个行业的&#xff0c;更多的是裁员的消息&#xff0c;很少有以往的风风火火的招聘了。无论是金九银十还是在以往的淡季。 谁也不知道这样一个特殊的寒冬还有多久才能过去。但是无论面对什么样的局…...

组里新来了个00后,真卷不过....

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…...

python 命令添加参数

官网 argparse模块可以很容易地编写用户友好的命令行界面。程序定义它需要什么参数&#xff0c;argparse将找出如何从sys.argv中解析这些参数。argparse模块还会自动生成帮助和用法消息。当用户为程序提供无效参数时&#xff0c;该模块也会发出错误。 核心功能 argparse模块对…...

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…...

jmx_exporter安装

下载 wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar 创建jmx_exporter.yml文件 文件内容为&#xff1a; rules: - pattern: ".*" 配置tomcatpinter/apache-tomcat-8.5.38/bin/ca…...

怎么给自己的微信公众号留言?

为什么公众号没有留言功能&#xff1f;根据要求&#xff0c;自2018年2月12日起&#xff0c;新申请的微信公众号默认无留言功能。有些人听过一个说法&#xff1a;公众号粉丝累计到一定程度或者原创文章数量累计到一定程度就可以开通留言功能。其实这个方法是2018年之前才可以&am…...

Unity中 URP 下的棋盘格Shader

文章目录 前言一、制作思路法1&#xff1a;使用纹理采样后&#xff0c;修改重铺效果法2&#xff1a;计算实现 二、粗略计算实现棋盘格效果1、使 uv.x < 0.5 区域 0 。反之&#xff0c; 0.52、使 uv.y < 0.5 区域 0 。反之&#xff0c; 0.53、使两个颜色相加4、取小数…...

杰发科技AC7840——SPM电源管理之低功耗模式

0、SPM简介 很早以前就听过低功耗模式&#xff0c;一直没有怎么深入了解&#xff0c;最近遇到几个项目都是跟低功耗有关。正好AutoChips的芯片都有电源管理的功能&#xff0c;在此借用AC7840的SPM对低功耗进行测试。 1、AC7840的5种功耗模式 2、AC7840的模式转换 3、唤醒 在…...

PCL 点云匹配 之NICP(Normal ICP)

一、概述 上面一篇中我们已经得出了一个结论&#xff0c;就是ICP虽然简单&#xff0c;但是也有明显的缺点 1、计算速度慢&#xff0c;收敛慢&#xff0c;迭代次数多 2、对内存的开销比较大 3、很容易陷入局部最优的困局 因此我们在经典ICP的基础上添加一两个约束&#xff1a; 第…...

华脉智联融合通信一张图

随着通信技术、信息技术以及互联网的发展&#xff0c;融合通信技术也日益发展成熟。融合通信系统作为常见的通信指挥调度系统&#xff0c;其发挥的功能也越来越强大&#xff0c;在不同行业中的应用也越来越丰富。 华脉智联深耕融合通信行业多年&#xff0c;自主研发的融合通信…...

Flink系列之:窗口Top-N

Flink系列之&#xff1a;窗口Top-N 一、窗口Top-N二、示例&#xff1a;在窗口聚合后进行窗口 Top-N三、在窗口表值函数后进行窗口 Top-N四、限制 一、窗口Top-N 适用于流、批一体窗口 Top-N 是特殊的 Top-N&#xff0c;它返回每个分区键的每个窗口的N个最小或最大值。与普通To…...

【k8s】--insecure-registry详解 ( 访问仓库、https、http)

文章目录 一、--insecure-registry是什么二、如何使用--insecure-registry三、--insecure-registry的安全风险四、--insecure-registry的替代方案五、总结参考 一、–insecure-registry是什么 --insecure-registry是docker中用来设置与docker registry通信的安全限制的一个参数…...

ElementUI,修改el-cascader的默认样式

Element UI 中的下拉弹窗是通过在整个body标签末尾动态添加div实现的&#xff0c;所以修改样式时&#xff0c;必须要定义全局样式才能实现样式覆盖&#xff0c;那怎样才能避免全局的样式污染呢&#xff1f; 解决办法&#xff1a;通过给组件添加自定义的 popper-class 属性来避…...

外卖系统海外版:代码与美食的完美交融

在数字化时代&#xff0c;外卖系统海外版正引领着全球美食点餐的新潮流。不仅为用户提供了便捷的用餐服务&#xff0c;更通过技术创新为美食与代码之间搭建了一座桥梁。本文将探讨其中的一些技术应用&#xff0c;并呈现与美食完美交融的全新体验。 多语言支持代码示例 def m…...

Java代码解析:初学者的编程入门指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 Java作为一门强大而广泛应用的编程语言&#x…...

数据结构--图

树具有灵活性&#xff0c;并且存在许多不同的树的应用&#xff0c;但是就树本身而言有一定的局限性&#xff0c;树只能表示层次关系&#xff0c;比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中&#xff0c;数据元素之间的关系是任意的。 一、图…...

AXure的情景交互

目录 导语&#xff1a; 1.erp多样性登录界面 2.主页跳转 3.省级联动​编辑 4. 下拉加载 导语&#xff1a; Axure是一种流行的原型设计工具&#xff0c;可以用来创建网站和应用程序的交互原型。通过Axure&#xff0c;设计师可以创建情景交互&#xff0c;以展示用户与系统的交…...

数据库操作习题12.12

考虑如下的人员数据&#xff0c;其中加下划线的是主码&#xff0c;数据库模式由四个关系组成: employee (empname, street, city) works (empname, compname, salary) company(id, compname, city) managers (empname, mgrname) 其中 关系 employee 给出人员的基本信息,包括人员…...

Redis之INCR命令,通常用于统计网站访问量,文章访问量,分布式锁

前言 Redis的INCR命令用于将键的值增加1。如果键不存在&#xff0c;则会先将键的值设置为0&#xff0c;然后再执行INCR操作。INCR命令的作用是对计数器进行自增操作&#xff0c;可以用于实现多种场景&#xff0c;比如统计网站访问量、文章访问量、分布式锁等。 一、Redis键之…...