5、栈应用-表达式求值

本章内容使用上述栈结构函数,来完成表达式求值操作。

表达式例如:3*(7-2)  或者 (0-12)*((5-3)*3+2)/(2+2) 。

1、实现思路

        a、建立OPTR(运算符)和OPND(数字)两个栈,后输入字符串以'='结束

        b、自左向右扫描表达式

                若读取到数字,直接压入操作数栈,继续处理下一个字符;
                若读取到运算符,比较栈顶算符与读取的算符的优先级:
                            栈顶算符 < 读取的算符

                                将读取的算符压入栈,继续处理下一个字符;
                            栈顶算符 > 读取的算符

                                栈顶算符出栈,从操作数栈中取出两数字,                                                                                       根据出栈算符做运算,运算结果再压入操作数栈,继续处理当前字符;
                            栈顶算符 == 读取的算符

                                  栈顶算符出栈,括号出栈不保存,继续处理下一个字符;


           c、 结束条件是算符栈已空,最后操作数栈出栈输出计算结果。

2、运算符关系表

例如:

        3*(7-2) 

        

         

             

            

        

     

    

   

   

      

        

3、代码实现

        3.1、定义全局数组存放合法的运算符

static char opts[] = {'+','-','*','/','(',')','\n'};

        3.2、实现函数判断当前字符是不是运算符        

// 定义函数,判断当前的字符是不是运算符,如果是返回在运算符数组中的下标,如果不是返回-1 
int isOpt(const char ch)
{	int len = sizeof(opts) / sizeof(char);int i;for(i=0;i<len;i++){if(opts[i] == ch){return i;}}return -1;	
} 

        3.3、实现函数判断栈顶运算符和当前输入运算符的关系

// 定义函数获取栈顶运算符和当前输入运算符之间的关系
char Precede(SElemType ch1,SElemType ch2)
{// 根据运算符优先级表格,使用二维数组存储字符之间的关系 static char optsRelationArr[7][7] = {{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},{'>','>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=',-1},		{'>','>','>','>',-1,'>','>'},		{'<','<','<','<','<',-1,'='}};// 获取两个字符的排序下标 int idx1 = isOpt(ch1);int idx2 = isOpt(ch2);// 字符不存在直接返回-1 if(idx1 < 0 || idx2 < 0)  return -1; // 合法返回对应关系return optsRelationArr[idx1][idx2]; 
}

        ​​​​3.4、实现函数根据运算符求+-*/结果                

// 定义函数进行算数运算
SElemType Operator(SElemType a,SElemType x,SElemType b) 
{switch(x){case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;	}
}

        3.5、实现函数求表达式的结果

SElemType EvalueExpression()
{// 定义操作数栈和运算符栈SqStack OPND,OPTR;// 定义变量存储 计算中的两个数据SElemType a,b;// 定义变量存储数据出现多位数据的运算中间量  12  45这类操作数SElemType d;// 定义变量存储 运算栈栈顶字符SElemType x;// 定义变量存储用户输入的字符符号char c;	// 初始化操作数栈和运算符栈InitStack(&OPND);InitStack(&OPTR);// 现象运算符栈中添加\n作为运算结束Push(&OPTR,'\n');x = '\n';// 接收一个字符c = getchar();	// 循环结束数据并运算 // 结束条件为 ,循环条件为相反面: !(c=='\n' && x=='\n') while(!(c=='\n' && x=='\n')) {			if(isOpt(c) >= 0){			// c为运算符 ,比较x和c的大小char res = Precede(x,c);switch(res) {case '<':// 当前运算符入栈Push(&OPTR,c); // 继续接收下一个字符输入//scanf(" %c",&c);c = getchar();		// 结束匹配break;case '=':// 移除运算符栈顶的运算符  () 和 \n和\n相遇Pop(&OPTR,&x);// 继续接收下一个字符输入//scanf(" %c",&c);	c = getchar();	// 结束匹配break;case '>':// 移除运算符栈顶的运算符Pop(&OPTR,&x);// 移除操作数栈栈顶两个数据Pop(&OPND,&b);Pop(&OPND,&a);// 计算后结果入栈Push(&OPND,Operator(a,x,b));// 结束匹配 break;}}else if(c >= '0' && c <= '9'){			d = 0;// c为数字字符 -- 注意处理多个数字字符组合成一个数字的情况while(c >= '0' && c <= '9'){d = d * 10 + c - '0';// scanf(" %c",&c);	c = getchar();	}// 接收完毕将数据入栈					Push(&OPND,d);} 	else{			// 非法字符printf("出现非法字符\n");exit(OVERFLOW); } // 获取运算符栈顶数据,继续下一轮的运算 GetTop(OPTR,&x);}/***** 运算结束  *******/ // 移除操作数栈 栈顶元素Pop(&OPND,&x);// 如果操作栈为空则结果为栈顶元素,否则表达式不正确if(!StackEmpty(OPND)){		printf("表达式有问题\n");exit(OVERFLOW);} return x;	 
} 

          3.6、main函数测试结果        

int main(int argc, char *argv[]) {printf("请输入算数表达式,负数用(0-正数)表示:"); SElemType res = EvalueExpression();printf("%d",res);	return 0;
}

        

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

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

相关文章

【递归与回溯深度解析:经典题解精讲(下篇)】—— Leetcode

文章目录 有效的数独解数独单词搜索黄金矿工不同的路径||| 有效的数独 递归解法思路 将每个数独的格子视为一个任务&#xff0c;依次检查每个格子是否合法。 如果当前格子中的数字违反了数独规则&#xff08;在行、列或 33 小方块中重复&#xff09;&#xff0c;直接返回 Fals…

Llama 3 预训练(二)

目录 3. 预训练 3.1 预训练数据 3.1.1 网络数据筛选 PII 和安全过滤 文本提取与清理 去重&#xff08;De-duplication&#xff09; 启发式过滤&#xff08;Heuristic Filtering&#xff09; 基于模型的质量过滤 代码和数学推理数据处理 多语言数据处理 3.1.2 确定数…

Mono里运行C#脚本8—mono_image_storage_open打开EXE文件

Mono里运行C#脚本8—mono_image_storage_open打开EXE文件 前面分析哈希表的实现,以及文件打开的底层函数,还有保存到HASH表里的数据结构。 static MonoImageStorage * mono_image_storage_open (const char *fname) { char *key = NULL; key = mono_path_resolve_symlinks…

前端项目 node_modules依赖报错解决记录

1.首先尝试解决思路 npm报错就切换yarn &#xff0c; yarn报错就先切换npm删除 node_modules 跟 package-lock.json文件重新下载依 2. 报错信息&#xff1a; Module build failed: Error: Missing binding D:\vue-element-admin\node_modules\node-sass\vendor\win32-x64-8…

双指针——查找总价格为目标值的两个商品

一.题目描述 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 这个题目非常简单&#xff0c;其实就是判断有没有两个数加起来等于target。 三.算法解析 1.暴力解法 暴力解法的话我们可以枚举出所有的情况&#xff0c;然后判…

sqlserver镜像设置

本案例是双机热备&#xff0c;只设置主体服务器&#xff08;主&#xff09;和镜像服务器&#xff08;从&#xff09;&#xff0c;不设置见证服务器 设置镜像前先检查是否启用了 主从服务器数据库的 TCP/IP协议 和 RemoteDAC &#xff08;1&#xff09;打开SQL Server配置管理器…

Elasticsearch:analyzer(分析器)

一、概述 可用于将字符串字段转换为单独的术语&#xff1a; 添加到倒排索引中&#xff0c;以便文档可搜索。级查询&#xff08;如 生成搜索词的 match查询&#xff09;使用。 分析器分为内置分析器和自定义的分析器&#xff0c;它们都是由若干个字符过滤器&#xff08;chara…

ElementPlus 自定义封装 el-date-picker 的快捷功能

文章目录 需求分析 需求 分析 我们看到官网上给出的案例如下&#xff0c;但是不太满足我们用户想要的快捷功能&#xff0c;因为不太多&#xff0c;因此需要我们自己封装一些&#xff0c;方法如下 外部自定义该组件的快捷内容 export const getPickerOptions () > {cons…

低代码开发平台排名2024

低代码开发平台在过去几年中迅速崛起&#xff0c;成为企业数字化转型的重要工具。这些平台通过可视化界面和拖放组件&#xff0c;使业务人员和技术人员都能快速构建应用程序&#xff0c;大大缩短了开发周期。以下是一些在2024年值得关注和使用的低代码开发平台。 一、Zoho Cre…

Substrate Saturday 回顾:如何利用 Polkadot Cloud 扩展 Solana 网络服务?

Lollipop 是一个为 Solana 生态系统设计的创新解决方案&#xff0c;与传统的 Layer 2 解决方案不同&#xff0c;Lollipop 通过其独特的 Network Extensions 设计&#xff0c;避免了生态系统的碎片化&#xff0c;同时为开发者提供了定制化的运行环境。Lollipop 旨在解决传统 rol…

Java重要面试名词整理(十):Kafka

文章目录 Kafka简介相关概念Kraft集群 Kafka收发消息梳理客户端工作机制消费者分组消费机制生产者拦截器机制消息序列化机制消息分区路由机制生产者消息缓存机制发送应答机制生产者消息幂等性生产者消息事务 Kafka集群架构设计-Kafka的Zookeeper元数据梳理Leader Partition选举…

计算机网络——期末复习(4)协议或技术汇总、思维导图

思维导图 协议与技术 物理层通信协议&#xff1a;曼彻斯特编码链路层通信协议&#xff1a;CSMA/CD &#xff08;1&#xff09;停止-等待协议&#xff08;属于自动请求重传ARQ协议&#xff09;&#xff1a;确认、否认、重传、超时重传、 &#xff08;2&#xff09;回退N帧协…

【MySQL学习笔记】关于索引

文章目录 【MySQL学习笔记】关于索引1.索引数据结构2.索引存储3.联合索引3.1 联合索引的b树结构3.2 索引覆盖&#xff1f;回表&#xff1f;3.3 联合索引最左匹配原则3.5 索引下推 4.索引失效 【MySQL学习笔记】关于索引 1.索引数据结构 索引是一种能提高查询速度的数据结构。…

D104【python 接口自动化学习】- pytest进阶参数化用法

day104 pytest参数化parametrize单参数 学习日期&#xff1a;20241223 学习目标&#xff1a;pytest基础用法 -- pytest参数化parametrize单参数 学习笔记&#xff1a; 参数化 parametrize 参数化可以组装测试数据&#xff0c;在测试前定义好测试数据&#xff0c;并在测试用…

Node.JS 版本管理工具 Fnm 安装及配置(Windows)

安装流程可参考&#xff1a;fnm 安装及配置(Windows)_fnm安装-CSDN博客 然后就是在git bash如何生效 在 Git Bash 中使用 fnm 需要确保你正确设置了环境变量。你可以按照以下步骤进行配置&#xff1a; 1. **打开 Git Bash**&#xff1a; 启动 Git Bash。 2. **编辑 .bas…

第T4周:TensorFlow实现猴痘识别(Tensorboard的使用)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 1、学习tensorboard的使用 具体实现&#xff1a; &#xff08;一&#xff09;环境&#xff1a; 语言环境&#xff1a;Python 3.10 编 译 器…

Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde

介绍 安装自己的linux-server,可以作为学习使用&#xff0c;web方式访问&#xff0c;基于ubuntu构建开源项目 https://github.com/linuxserver/docker-webtop安装 docker run -d -p 1336:3000 -e PASSWORD123456 --name webtop lscr.io/linuxserver/webtop:ubuntu-kde登录 …

vue3 ref reactive响应式数据,赋值的问题、解构失去响应式问题

在 Vue3 中&#xff0c;使用 ref 和 reactive 创建响应式数据时&#xff0c;赋值操作和解构赋值存在一些需要注意的事项。以下是对这些问题的详细解答以及代码示例&#xff1a; ref 和 reactive 的基本用法 ref&#xff1a;主要用于基本数据类型&#xff08;如 Number、String、…

小米路由器开启SSH,配置阿里云ddns,开启外网访问SSH和WEB管理界面

文章目录 前言一、开启SSH二、配置阿里云ddns1.准备工作2.创建ddns脚本3.添加定时任务 三、开启外网访问SSH和WEB管理界面1、解除WEB管理页面访问限制2.手动添加防火墙端口转发规则&#xff0c;开启外网访问WEB管理和SSH 前言 例如&#xff1a;随着人工智能的不断发展&#xf…

什么是ESC ---- 防止车辆打滑并提高驾驶时稳定性的技术

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所谓鸡汤&#xff0c;要么蛊惑你认命&#xff0c;要么怂恿你拼命&#xff0c;但都是回避问题的根源&…