11-数据结构-栈和队列的应用(C语言)

 栈和队列的应用


目录

 栈和队列的应用

一、括号匹配(栈)

二、表达式的各种转换

(1)中缀转后缀(手工)

(2)后缀转中缀表达式(手工)

(3)中缀转后缀(栈)

(4)中缀转后缀(树)

(5)后缀表达式求值

(6)中缀表达式求值(栈)

三、栈在递归的应用

四、队列的应用

一、括号匹配(栈)

        思想:括号匹配就是有() [] {},各种各样的括号,符合相应匹配的括号正确,否则为非法情况。

        主要利用栈,给括号凑存入数组中。然后读取,当读取左括号时,入栈,当遇到右括号时,栈内出栈,与之对比,若匹配则继续扫描数组,否则则非法,程序结束,非法情况除了括号不对应外,还有,两种,一个是扫到右括号,去栈内拿括号,结果栈空了。另一种则是栈内还有括号,但是数组已经读取完了。

        代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//创建栈
typedef struct
{char data[50];int top;	
}SqStack;
void InitStack(SqStack *s)
{s->top=-1;	
}
//入栈 
void StackPush(SqStack *s,char x)
{s->top++;s->data[s->top]=x;
}
//出栈
void StackPop(SqStack *s,char *e)
{if(s->top == -1){printf("栈都空了,没东西了\n");exit(-1);}*e =s->data[s->top];s->top--;			
}
void  KuohaoMatch(char *num,int len)
{SqStack s;InitStack(&s);int i;for(i=0;i<len;i++){if(num[i]=='(' || num[i]=='[' || num[i]== '{') StackPush(&s,num[i]);else{if(s.top== -1){printf("栈内没有匹配的括号,匹配失败\n"); exit(-1);}char e='a';StackPop(&s,&e);if(num[i]=='}' && e != '{') {printf("}匹配失败\n");exit(-1);}if(num[i]==']' && e != '[') {printf("]匹配失败\n");exit(-1);}if(num[i]==')' && e != '(') {printf(")匹配失败\n");exit(-1);}}} if(s.top==-1)printf("匹配完毕,未发现异常,匹配成功\n");elseprintf("栈内仍有括号,匹配失败\n"); }int main()
{char num[10]="{([])}";int len=strlen(num);KuohaoMatch(num,len);return 0;
}

二、表达式的各种转换

       表达式,根据操作符的位置,有不同的叫法,如a+b,为中缀,因为+在中间。同理+ab为前缀,ab-为后缀。

        我们日常见到的为中缀表达式,但如果让计算机识别的话,比较费劲,因此我们如果给中缀表达式转化为后缀表达式(当计算机遇到两个操作数和一个操作算符就会直接计算)或前缀表达式(当计算机遇到一个操作算符和两个操作数就会直接计算),这计算机就可直接进行计算,

(1)中缀转后缀(手工)

        如:A+B*(C-D)-E/F.

由于同级操作算符,中缀可以转不同的后缀表达式,不唯一

两种计算方法:
        方法一:我们可以根据优先级,一块一块的去算,先计算(C-D)为CD-,E/F为EF/,而B*(CD-)也是两操作数,因此为BCD-*,随后A+(BCD-*)为两个操作数,所以ABCD-*+,最后(ABCD-*+)-(EF/)为两个操作数,因此为:ABCD-*+EF/-.

 方法二:从左至右书写字符,按照优先级,如果能计算,优先计算,

(2)后缀转中缀表达式(手工)

        后缀表达式则跟中缀思想差不多,也是块思想,每一个小的操作计算,都是一小块一个整体,又内向外,逐层计算。

 注意:变为中缀,要根据优先级,加括号记得,此外由后缀转中缀,结果唯一

(3)中缀转后缀(栈)

        之前是手工草稿推的,一般选择填空应用,够用了,不过如果,要求按照栈的思想,去实现中缀转后缀,则需要学一下这个。

        大致思想:遍历到字符,直接输出,遍历到操作符,给它入栈,如果又遇到操作符,便与栈顶的操作符对比,如果栈顶的操作符优先级高,则给栈顶弹出,优先级低的,入栈。此外遇到(),先入(,之后遇见),则给栈内(之前的内容都弹出。

        

(4)中缀转后缀(树)

即给表达式,写成树的形式,其中根节点为符号,每一棵树为一个小计算整体,此外选每颗树的根时,先理清楚计算先后,以及整体。

        给中缀先转化成树的形式。

根据计算优先级,划分括号,然后再原意义一样的情况下,组成树。最开始的根节点为操作符。

如:A+B*(C-D)-E/F

 

 

 


        给出表达式树,求中缀或前缀,后缀表达式:

给每个结点表上1 2 3,然后从最上层开始画线,跑一圈,其中1代表前缀,2中缀,3后缀

(5)后缀表达式求值

        利用栈的大致思想:给操作数入栈,遇到操作符从栈中弹出两个数,进行计算,计算结果,接着入栈。依次类推。

最后几步,类似这样,一直弄完,

手工求解。

方法一:可先给后缀表达为中缀,(画框法,没每一个小块先转换,由内向外逐层转换)

方法二:遇到两个操作数和一个操作符,三者挨着的,优先计算,依次类推。前缀一样思想

 

(6)中缀表达式求值(栈)

创建两个栈,一个栈存操作符,一个栈存操作数,

当识别到操作符,并且比操作符栈顶操作符优先级小时,弹出两个数,进行计算,并入字符数栈。

优先级相同时,遵循最左原则,操作符栈内的优先计算,

如:3*(7-2),另外,进行栈求的时候,需要给表达式两边加上#号。

#3*(7-2)#

操作符栈:#  *  ( - 

操作数栈:3  7   2 

栈内-比)优先级高,-弹出,7 2 弹出,计算,7-2=5,5入数栈,另外计算减法时,按照原本意义计算,不能减反了

操作符栈:#  *  

操作数栈:3  5

栈内*比栈外,#优先级高,*弹出,3 5 弹出,计算3*5=15,15入栈

操作符栈:##

操作数栈:15

#检测到与它相等的#,程序结束。

三、栈在递归的应用

        这里即递归的意义。

        递归就是在系统栈中,开辟临时空间,进行操作。逐层创建内推,到最内层的结束条件时,再往回返回。

四、队列的应用

二叉树层次遍历,

        从上而下,从左至右,一个树一个树的进行,每次遍历都是入队,然后从对头挨个处理即可!

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

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

相关文章

基于大模型的数据血缘异常归因分析

近日&#xff0c;以“元数据技术及应用创新”为主题&#xff0c;最新一季StartDT Hackathon&#xff08;奇点云黑客马拉松&#xff09;正式收官。 本期黑客松共吸引了近50位选手参赛&#xff0c;有的在实时数仓领域显神通&#xff0c;有的则再次请出了大模型。这些小组都有个共…

Angular安全专辑 —— CSP防止XSS攻击

什么是 CSP&#xff08;Content Security Policy&#xff09; CSP&#xff08;Content Security Policy&#xff09;是一种Web安全策略&#xff0c;用于减轻和防止跨站脚本攻击&#xff08;XSS&#xff09;等安全漏洞。它通过允许网站管理员定义哪些资源可以加载到网页中&#…

ELK 将数据流转换回常规索引

ELK 将数据流转换回常规索引 现象&#xff1a;创建索引模板是打开了数据流&#xff0c;导致不能创建常规索引&#xff0c;并且手动修改、删除索引模板失败 "reason" : "composable template [logs_template] with index patterns [new-pattern*], priority [2…

【Linux】进程信号之信号的处理

进程信号 三 一、信号的处理时机二、内核态与用户态1、内核态与用户态的转化2、重谈进程地址空间 三、信号的处理1、一般信号的处理流程2、捕捉信号的处理流程3、信号捕捉函数sigaction 一、信号的处理时机 在前面我们讲过信号产生和保存以后&#xff0c;我们知道进程对于产生…

【AI底层逻辑】——篇章7(上):海量运算背后的算力支持

目录 引入 一、计算机芯片 1、芯片的制造 2、复杂指令集&精简指令集 3、并行计算的GPU 二、协作计算 1、分布式技术“三论文” 2、不可兼得的CAP定理 3、故障类型 续下篇... 往期精彩&#xff1a; 引入 早在2016年DeepMind就公布了AlphaGo的算法细节&#xff0…

Android平台GB28181设备接入端如何实现多视频通道接入?

技术背景 我们在设计Android平台GB28181设备接入模块的时候&#xff0c;有这样的场景诉求&#xff0c;一个设备可能需要多个通道&#xff0c;常见的场景&#xff0c;比如车载终端&#xff0c;一台设备&#xff0c;可能需要接入多个摄像头&#xff0c;那么这台车载终端设备可以…

海外ASO优化之关于应用的营销2

在目标受众中建立信任度&#xff0c;并获得博客/新闻网站的热榜&#xff0c;这样自然会提高应用的知名度和目标受众的认知度。就博客读者而言&#xff0c;需要找出推荐的最佳时间和真正推动我们应用是什么。 1、提供了App Store或Google Play的直接链接。 我们首先需要创建一个…

为react项目添加开发/提交规范(前端工程化、eslint、prettier、husky、commitlint、stylelint)

因历史遗留原因&#xff0c;接手的项目没有代码提醒/格式化&#xff0c;包括 eslint、pretttier&#xff0c;也没有 commit 提交校验&#xff0c;如 husky、commitlint、stylelint&#xff0c;与其期待自己或者同事的代码写得完美无缺&#xff0c;不如通过一些工具来进行规范和…

python异常处理

1、菜鸟教程里返回try的意思是&#xff0c;如果try引发的error和except后的类型不符&#xff0c;则except无法处理这个error&#xff0c;就会返回try中。 try:result1/0 except NameError : #try引发的是ZeroDivisionError&#xff0c;与NameError不同&#xff0c;所以print不…

【uniapp】滚动相关

1、滚动到一定区域&#xff0c;顶部内容置换并置顶 功能&#xff1a; 当我向下滚动时&#xff0c;当关注那一行快到顶部的时候&#xff0c;把左侧区域的内容切换成右侧区域的内容&#xff0c;并置顶 原先我使用v-if来显示隐藏&#xff0c;发现会出现闪屏的现象&#xff0c;后来…

Java 正则表达式【匹配与分组基本原理】

简介 我们一般使用正则表达式是用来处理字符串的&#xff0c;不管是实际的开发中还是我们的算法竞赛中&#xff0c;使用正则表达式绝对可以大大提升我们的效率。 正则表达式&#xff08;regular expression&#xff09;其实就是对字符串进行模式匹配的技术。 快速入门 我们这里…

面试热题(岛屿数量)

给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格的四条边均…