逆波兰表达式_四则表达式

2023-10-22 06:48
文章标签 表达式 波兰 四则

本文主要是介绍逆波兰表达式_四则表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 逆波兰表达式实现的四则运算

在这里插入图片描述

2. 如何把中缀表达式转换为后缀表达式
这个就有点复杂了,待补充
hj50 四则运算

在这里插入图片描述
主要思路:
用两个栈来维护进行计算:
一个栈放运算符(“±*/(”), 一个栈放数字
在这里插入图片描述

// 如何判断'+'或'-'是加减还是正负?
// 用一个变量来判断:数字和运算符是交替出现的(括号的出现不会影响这种交替关系)#include <iostream>
#include <stack>
using namespace std;string mp = "+-*/)]}"; // 没有左括号void doCal(stack<double> &st, stack<char> &so)
{//数字栈中弹出的两个元素,谁减谁,这里顺序错了//double a=st.top();//第一次弹出的应该是要减去的值double b = st.top();st.pop();double a = st.top();st.pop();// 运算符char ch = so.top();so.pop();if (ch == '+')a = a + b;else if (ch == '-')a = a - b;else if (ch == '*')a = a * b;else if (ch == '/')a = a / b;st.push(a);return;
}bool cmp(char c1, char c2)
{if (c1 == '('){return false; // 因为所有左括号统一成(压入,遇到(,c2是什么运算符都继续压入栈,不是弹出栈顶,做运算}// 默认c1优先级<c2, 所以返回false, c2入栈else if ((c1 == '+' || c1 == '-') && (c2 == '*' || c2 == '/')){return false;}return true; // c2运算
}int main()
{string s;while (getline(cin, s)){stack<double> st; // 数字栈stack<char> so;   // 运算符栈so.push('(');s += ')';bool IsOp = false; //第一次一定是数字for (int i = 0; i < s.size(); i++){// 妈的这个括号,调bug半天if (s[i] == '(' || s[i] == '[' || s[i] == '{'){so.push('(');}else if (s[i] == ')' || s[i] == ']' || s[i] == '}'){while (so.top() != '('){doCal(st, so);}so.pop(); // 此时so.top()='(', 将‘(’出栈}// 遇到四则运算符:前面的两个判断已经把括号的情况去除了else if (IsOp){// 比较当前运算符和栈顶优先级,栈顶此刻只有两种可能:// 在(和运算符+ -*/中,若栈顶优先级高,运算while (cmp(so.top(), s[i])){doCal(st, so);}// 当前优先级高,入栈so.push(s[i]);IsOp = false; // 一个运算符结束后一定是数字}// 遇到运算符和数字,找到运算符数字长度,从字符串中截取,还原数字然后压入栈中// 只有 +33 与 -33才能进入这个循环else{int j = i; // i=0if (s[j] == '-' || s[j] == '+'){i++; // 运算符的索引位置为j, i=1定位数字的索引位置}// 这个是啥意思啊,看不懂:即没找到 +33,到33时都为mp.npos,所以i++=3while (mp.find(s[i]) == mp.npos) // 找不到就i++{i++; // i=3, 直到找到一个数字之后的运算符就退出}string t = s.substr(j, i - j); // substr(10, 12-10)st.push((double)stoi(t));      // stoi(string)=int, eg: stoi(-4)=-4i--;IsOp = true; // 数字之后一定是( 或者 四则运算符}}cout << st.top() << endl;}return 0;
}

这篇关于逆波兰表达式_四则表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/259783

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采

将浮点型算式的中缀表达式转换成后缀表达式并算出式子结果

最近因为需要了解如何将在Win应用程序控制台输入的算式表达式转化成其后缀表达式的算法,所以在网上搜索了一下,看到许多人的程序都只是对应于运算数在0~9的范围内的整型运算式,所以自己就写了一个可以计算浮点型算式的程序,一下是运行时的截图: 式子中的a,b,c是可供用户自行输入的变量。 首先,我先对输入的运算符进行了简单的合法性判断,我的判断代 码如下: //函数的传入参

Kotlin高阶函数与Lambda表达式及内联函数的介绍

目录 1、高阶函数1.1、什么是高阶函数?1.1.1、不带返回值的高阶函数1.1.2、带参数且带返回值的高阶函数1.1.3、与一般的函数进行比较 1.2、如何使用?1.3、高阶函数有什么作用? 2、Lambda表达式2.1、什么是Lambda表达式?2.1.1、无参数的写法2.1.2、有参数的写法2.1.3、有参数且有返回值的写法 2.2、如何使用?2.3、Lambda表达式有什么作用? 3