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.mzph.cn/news/34270.shtml

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

相关文章

EasyExcel多次写入数据多个EasyExcel文件导出到zip压缩文件

笔者最近需要导出一百多万条数据到Excel&#xff0c;已经超出单张工作表的最大容量&#xff08;2^201048576&#xff09;&#xff0c;需要导出到多个工作表或多个Excel文件。 海量数据导出面临的问题有以下几个&#xff1a; 如果一次性查出所有数据&#xff0c;很可能内存溢出…

jackson库收发json格式数据和ajax发送json格式的数据

一、jackson库收发json格式数据 jackson库是maven仓库中用来实现组织json数据功能的库。 json格式  json格式一个组织数据的字符文本格式&#xff0c;它用键值对的方式存贮数据&#xff0c;json数据都是有一对对键值对组成的&#xff0c;键只能是字符串&#xff0c;用双引号包…

ArcGIS API for JavaScript 4.x 教程(一) 显示一张地图

了解如何创建和显示带有基本地图图层的地图。 地图包含地理数据层。地图包含一个基本地图层&#xff0c;以及一个或多个数据层&#xff08;可选&#xff09;。可以使用地图视图显示地图的特定区域&#xff0c;并设置位置和缩放级别。 本教程将向您展示如何使用地形底图层创建和…

时序预测 | Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 时序预测 | Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型 1.Matlab实现基于GRNN广义回归神经网络的电力负荷预测模型 2.单变量时间序列预测; 3.多指标评价,评价指标包括:R2、MAE、MBE等,代码质量极高…

XML学习基础知识归纳(一)

一、XML基本概述 &#xff08;1&#xff09;概念&#xff1a;XML是可扩展的标记语言&#xff0c;xml文档的后缀名为 .xml &#xff08;2&#xff09;作用&#xff1a;用来用来传输和存储数据&#xff0c;不用于表现和展示数据&#xff0c;这点呢相比于HTML来说是不同的&#…

vue2中实现响应式的原理object.defineproperty+发布定于模式的缺点

缺点&#xff1a; 1 不能监测到新增属性或者删除属性 2 不能检测到根据数组索引替换或新增的值。也无法监测数组索引的变化。 由于object.defineproperty&#xff08;对象&#xff0c;描述&#xff0c;对象的某个属性&#xff09;其实是对对象的某个属性进行修改&#xff0c;因…

python函数、运算符等简单介绍3(无顺序)

set&#xff08;集合&#xff09; 集合(set) -> 负责存储【不重复的数据】&#xff0c;并且是【无序存储】 的容器&#xff0c;主要用来去重和逻辑比较 set1 {1,2,3,4,58,7,4,1,2,3,5} print(set1) print(type(set1)) # 输出结果&#xff1a; {1, 2, 3, 4, 5, 7, 58} <…

svn文章四:版本控制策略 - 穿越时光机:SVN版本控制进阶技巧

文章四&#xff1a;版本控制策略 - “穿越时光机&#xff1a;SVN版本控制进阶技巧” 概述&#xff1a;版本控制是SVN的核心功能。本文将深入研究SVN版本控制的进阶技巧&#xff0c;包括标签管理、历史查看、版本回退等&#xff0c;让您成为版本控制的高手。 1. 引言 版本控制…

excel 之 VBA

1、excel和VBA 高效办公&#xff0c;把重复性的工作写成VBA代码&#xff08;VB代码的衍生物&#xff0c;语法和VBA相同&#xff09;。 首先打开开发工具模式&#xff0c;如果没有选显卡&#xff0c;需要手动打开 打开程序编辑界面 快捷键 altF11一般操作 程序调试&#xf…

概率论与数理统计:第二、三章:一维~n维随机变量及其分布

文章目录 Ch2. 一维随机变量及其分布1.一维随机变量1.随机变量2.分布函数 F ( x ) F(x) F(x)(1)定义(2)分布函数的性质 (充要条件)(3)分布函数的应用——求概率3.最大最小值函数 2.一维离散型随机变量及其概率分布(分布律)3.一维连续型随机变量及其概率分布(概率密度)4.一般类型…

【Nginx15】Nginx学习:HTTP核心模块(十二)内嵌变量

Nginx学习&#xff1a;HTTP核心模块&#xff08;十二&#xff09;内嵌变量 关于内嵌变量&#xff0c;其实就是 Nginx 开放给我们的在配置文件中可以使用的变量。源码中无非就是替换成真实的代码变量进行操作。这些变量可以帮助我们做很多事情。之前的文章中其实也有不少地方用到…

深度学习关键要素:数据集汇总与分享

引言 在深度学习的应用中&#xff0c;数据被认为是最重要的因素之一。因此&#xff0c;选择一个好的数据集对于深度学习的成功至关重要。在选择数据集时&#xff0c;不仅需要关注数据量的大小、多样性以及质量&#xff0c;还要考虑数据集是否代表了所研究问题的真实情况。本文…

2023国赛数学建模B题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

Python - 读取pdf、word、excel、ppt、csv、txt文件提取所有文本

前言 本文对使用python读取pdf、word、excel、ppt、csv、txt等常用文件&#xff0c;并提取所有文本的方法进行分享和使用总结。 可以读取不同文件的库和方法当然不止下面分享的这些&#xff0c;本文的代码主要目标都是&#xff1a;方便提取文件中所有文本的实现方式。 这些库的…

【Spring Boot】夺名连环问(持续更新ing)

Spring的了解与特性 简单介绍&#xff1a;快速开发Spring项目的脚手架。简化Spring应用的初始搭建以及开发过程。 特性 提供了很多内置的Starter结合自动配置&#xff0c;对主流框架的无配置集成、开箱即用。即不需要自己去引入很多依赖。 并且管理了常用的第三方依赖的版本&…

0001nginx简介、相关模型与原理

文章目录 一. 什么是Nginx二. ngnix的一些模型1、nginx的进程模型2、worker的抢占&#xff08;锁&#xff09;机制模型3. nginx事件处理模型 三. nginx加载静态资源的过程 一. 什么是Nginx Nginx是一个高性能HTTP反向代理服务器&#xff0c;以下是nginx的相关能力 反向代理&am…

(力扣)用两个队列实现栈---C语言

分享一首歌曲吧&#xff0c;希望在枯燥的刷题生活中带给你希望和勇气&#xff0c;加油&#xff01; 题目&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#…

ElasticSearch单节点部署

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

大模型在金融医疗、生命系统和物理仿真领域的创新应用探索

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 在当今迅速发展的科技领域&#xff0c;大模型技术正日益成为金融医疗、生命系统和物理仿真等领域中的重要工具。2023年6月16日&#xff0c;AI TIME举办的青年科学家大模型专场活动邀请了国防科技大学理学院数学…

VUE+ElementUI的表单验证二选一必填项,并且满足条件后清除表单验证提示

上代码 <el-form-item label"出库单号" prop"ecode" ref"ecode" :rules"rules.ecode"><el-input v-model"queryParams.ecode" placeholder"出库单号和出库箱号至少填写一项" clearable style"width…