c#栈应用——实现四则运算

前言:四则运算,大家都不陌生,在上小学的时候,数学中学到过的知识,那么如何在程序中实现呢?下面,我们就用程序来实现9+(3-2)*(5-3)/4*3,这个算式的值。计算的时候,有一个规则”先乘除,后加减,从左到右,先括号内后括号外“。

其优先级就是 加减<乘除<括号

这个算式,我们可以很轻松的计算出它的值等于10.5。这是我们常用的四则表达式,又叫做中缀表达式。这种计算的复杂之处在与乘除在加减之后,并且还有括号,放在程序里的判断,就复杂了,那么如何简化呢?伟大的科学家想到了好的处理办法,

一、逆波兰(Reverse Polish Notation,RPN):一种不需要括号的后缀表达法,我们也称之为逆波兰。

上面的四则运算表达式,转换未后缀表达法之后,变为 9 3 2 - * 5 3 - 4 / 3 * +,叫后缀的原因所有的符号都是在要运算数字的后面出现。

如何实现由中缀表达式转化未后缀表达式呢?

规则:依次从左向右遍历表达式,若是数字加入到集合;若是符号,则需要判断其与栈顶符号的优先级,如果当前元素是右括号或优先级较低的符号,则栈顶的元素一次出栈并输出,并将当前符号进栈;如果当前元素和栈顶的元素优先级相同,将栈顶的同级元素依次出栈。

实现代码:

string str = "9+(3-2)*(5-3)/4*3";
string cz = ")+-";   //需要出栈的操作
string rz = "(*/";   //入栈的符号
string hig = "*/";   //优先级高的
string zkh = "(";    //左括号
string ykh = ")";    //右括号
Stack stack = new Stack();
int lj = str.Length - 1;
ArrayList list = new ArrayList();
//从左到右遍历中缀表达式的每个数字和符号,
for (int i = 0; i < str.Length; i++)
{string item = str.Substring(i, 1);//1、若是数字输出,即成为后缀表达式的一部分;if (digital.Contains(item)){Console.Write($"{item}\t");list.Add(item);}else{//若是符号if (rz.Contains(item) || stack.Count == 0){if (stack.Count > 0){string chr = (string)stack.Pop();if (hig.Contains(chr)){list.Add(chr);Console.Write($"{chr}\t");}else{stack.Push(chr);}}stack.Push(item);}else{//优先级低与栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出if (ykh.Contains(item)){while (stack.Count > 0){string zk = (string)stack.Pop();if (zkh.Contains(zk)){break;}list.Add(zk);Console.Write($"{zk}\t");}continue;}if (cz.Contains(item)){string chr = (string)stack.Pop();if (hig.Contains(chr)){list.Add(chr);Console.Write($"{chr}\t");while (stack.Count > 0){string ab = (string)stack.Pop();list.Add(ab);Console.Write($"{ab}\t");}}else{stack.Push(chr);}stack.Push(item);continue;}stack.Push(item);}}if (lj == i){while (stack.Count > 0){string ab = (string)stack.Pop();list.Add(ab);Console.Write($"{ab}\t");}}}Console.WriteLine();for(var i= 0; i < list.Count; i++){string a = list[i].ToString();Console.Write($"{a} \t");}

二、由上面计算得到后缀表达式,那么如何使用栈来计算这个表达式呢?

计算规则:依次遍历后缀表达式,如果是数字,则入栈,如果是符号,则将栈顶的两个元素出栈,进行计算,计算完成之后,将结果入栈。

代码如下:

string digital = "0123456789";
Stack calcStack = new Stack();
foreach(var item in list)
{//如果是数字,入栈if (digital.Contains(item.ToString())){calcStack.Push(item);}else{//如果是符号,则把栈顶的两个数字出栈,进行计算,入栈。string clfh = item.ToString();double hz1, hz2;double.TryParse(calcStack.Pop().ToString(), out hz2);double.TryParse(calcStack.Pop().ToString(), out hz1);double result = GetResult(hz1, hz2, clfh);calcStack.Push(result);}
}
Console.WriteLine();
Console.WriteLine();
while (calcStack.Count > 0)
{Console.WriteLine($"{str} = {calcStack.Pop()}");
}
private static double GetResult (double ca1, double ca2,string fh)
{if(fh=="+")return ca1 + ca2;else if(fh=="-")return ca1 - ca2;else if(fh== "*")return ca1 * ca2;elsereturn ca1 / ca2;
}

备注:其中逆波兰解释,来自《大话数据结构》一书。

PS:当前代码计算小于10的四则运算。

欢迎大家批评指正,小可不胜感激。

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

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

相关文章

MySQL学习笔记 ------ 分页查询

#进阶8&#xff1a;分页查询 ★ /* 应用场景&#xff1a;当要显示的数据&#xff0c;一页显示不全&#xff0c;需要分页提交sql请求 语法&#xff1a; select 查询列表 from 表 【join type join 表2 on 连接条件 where 筛选条件 group by 分组字段 …

搭建基于Nginx+Keepalived的高可用web集群并实现监控告警

目录 搭建相关服务器DNS服务器配置WEB服务器配置配置静态IP编译安装nginx 负载均衡器配置lb1lb2高可用配置 NFS服务器配置配置静态IP安装软件包新建共享目录web服务器挂载 监控服务器配置安装node-exporter编写prometheus.yml安装alertmanager和钉钉插件获取机器人webhook编写a…

Python实战之数据挖掘详解

一、Python数据挖掘 1.1 数据挖掘是什么&#xff1f; 数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中&#xff0c;通过算法&#xff0c;找出其中的规律、知识、信息的过程。Python作为一门广泛应用的编程语言&#xff0c;拥有丰富的数据挖掘库&#…

Nginx配置解析

server {listen 80;server_name example.com;location / {proxy_pass http://backend;}location / 是 Nginx 的一个匹配规则&#xff0c;用于匹配所有请求路径。proxy_pass 指令则用于将匹配到的请求转发给指定的后端服务器。下面是关于 location / 和 proxy_pass 的详细介绍&a…

解决嵌入式中QTableWidget双击出现空白QTableWidgetItem输入

目录 所说BUG现象解决方式1方式2全部内容 效果 今天突然想起在上个公司解决的一个BUG 嵌入式中QTableWidget一般只能看数据不能编辑&#xff0c;或者是选择 所以双击出现空白QTableWidgetItem是不允许的 所说BUG现象 解决 在空白的单元格中&#xff0c;添加不可编辑的QTableWid…

动手学深度学习——实战Kaggle比赛:预测房价

导入包&#xff0c;建立字典DATA_HUB包含数据集的url和验证文件完整性的sha-1密钥。定义download()函数用来下载数据集&#xff0c; 将数据集缓存在本地目录&#xff08;默认情况下为…/data&#xff09;中&#xff0c; 并返回下载文件的名称。定义download_extract()函数下载并…

数字孪生:未来科技的新前沿

数字孪生作为一项新兴的研究方向&#xff0c;正逐渐成为科技界的焦点。它是将现实世界中的实体、系统或过程通过数字化手段进行建模、仿真和分析&#xff0c;形成与实体相对应的数字化副本。数字孪生的发展为我们带来了无限的想象空间&#xff0c;以及解决现实问题的新途径。 在…

java.net.ConnectException: Connection refused: no further information

报错如下&#xff1a; java.net.ConnectException: Connection refused: no further informationat sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.8.0_181]at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) ~[na:1.8.0_181]a…

Zabbix监控安装grafana并配置图形操作

第三阶段基础 时 间&#xff1a;2023年7月20日 参加人&#xff1a;全班人员 内 容&#xff1a; Zabbix监控安装grafana 目录 安装并配置grafana 一、安装Grafana 二、下载安装插件 三、配置grafana 四、Web访问并配置&#xff1a; 安装并配置grafana 一、安装Graf…

【团队协作开发】将Gitee项目导入到本地IDEA中出现根目录不完整的问题解决(已解决)

前言&#xff1a;在团队协作开发过程中&#xff0c;通常我们的Gitee完整项目中会包含很多内容&#xff1a;后端代码、前端代码、项目结构图、项目文档等一系列资产。 将Gitee项目导入到本地IDEA中&#xff0c;通常会出现根目录不完整的问题。这是因为项目里面包含了后端代码、前…

如何使用Webman框架实现日历和事件提醒功能?

如何使用Webman框架实现日历和事件提醒功能&#xff1f; 引言&#xff1a; 在现代社会中&#xff0c;时间管理变得越来越重要。作为开发者&#xff0c;我们可以利用Webman框架来构建一个功能强大的日历应用程序&#xff0c;帮助人们更好地管理自己的时间。本文将介绍如何使用W…

基于Java+SpringBoot+vue前后端分离甘肃非物质文化网站设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

DAY51:动态规划(十五)买卖股票最佳时机Ⅲ+买卖股票最佳时期Ⅳ

文章目录 123.买卖股票最佳时机Ⅲ&#xff08;注意初始化&#xff09;思路DP数组含义递推公式初始化遍历顺序最开始的写法&#xff1a;初始化全部写成0debug测试&#xff1a;解答错误&#xff0c;第0天实际上是对应prices[0]和dp[0] 完整版总结 188.买卖股票最佳时机Ⅳ思路DP数…

09.计算机网络——套接字编程

文章目录 网络字节序socket编程socket 常见APIsockaddr结构 UDP编程创建socket绑定socketsendto发送数据recvform接收数据关闭socket TCP编程创建socket绑定socketlisten监听套接字accept服务端接收连接套接字connect客户端连接套接字send发送数据recv接收数据关闭socket 工具n…

【flink】ColumnarRowData

列式存储 在调试flink读取parquet文件时&#xff0c;读出来的数据是ColumnarRowData&#xff0c;由于parquet是列式存储的文件格式&#xff0c;所以需要用一种列式存储的表示方式&#xff0c;ColumnarRowData就是用来表示列式存储的一行数据&#xff0c;它包含多个数组的数据结…

从电商指标洞察到运营归因,只需几句话?AI 数智助理准备好了!

Lily 是名入职不久的电商运营助理&#xff0c;最近她想要根据 2022 年的客单价情况&#xff0c;分析品牌 A 在不同电商渠道的用户行为和表现&#xff0c;并提供一些有价值的洞察和建议给客户。然而在向技术人员提报表需求后&#xff0c;技术人员以需求排满为借口拒绝了。 Lily …

5分钟,结合 LangChain 搭建自己的生成式智能问答系统

伴随大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;的涌现&#xff0c;人们发现生成式人工智能在非常多领域具有重要意义&#xff0c;如图像生成&#xff0c;书写文稿&#xff0c;信息搜索等。随着 LLM 场景的多样化&#xff0c;大家希望 LLM 能在垂直…

记一次容器环境下出现 Address not available

作者&#xff1a;郑明泉、余凯 困惑的源地址 pod 创建后一段时间一直是正常运行&#xff0c;突然有一天发现没有新的连接创建了&#xff0c;业务上是通过 pod A 访问 svc B 的 svc name 的方式&#xff0c;进入 pod 手动去 wget 一下&#xff0c;发现报错了 Address not avai…

jar 更新 jar包内的 class,以及如何修改class

一、提取Jar 内文件 #提取jar内的配置文件jar -xvf a.jar META-INF\plugin.xml-已解压: META-INF/plugin.xml#提取jar内的class文件&#xff0c; 提示&#xff1a;反编译为java文件&#xff0c;修改后再使用javac xxx.java编译为class&#xff0c;jar -xvf a.jar io.config.**…

TCP长连接和短连接

tcp长连接和短连接 1. TCP短连接2. TCP长连接3. TCP长/短连接操作过程3.1 短连接的操作步骤3.2 长连接的操作步骤 4. TCP长/短连接的优点和缺点5. TCP长/短连接的应用场景 TCP在真正的读写操作之前&#xff0c;server 与 client之间必须建立一个连接&#xff0c;当读写操作完成…