当前位置: 首页 > news >正文

⌈C++11⌋实现一个简易计算器

 原理:

数据栈:有数据就直接入栈

运算符栈:设遍历到当前的运算符位e,如果栈不为空,比较栈顶与当前运算符优先级e,当栈顶运算符优先级大于或者等于e的优先级,则出栈,并将两个数据栈的数据出栈,计算出对应的数据,加入到数据栈中,否则将运算符入栈

#include <iostream>
#include <unordered_map>
#include <stack>
#include <functional>
#include <string>#define MAX_PRI INT_MAXusing namespace std;
int main() {//数据栈stack<double> _data;   //运算符栈stack<char> _operator;   //运算符优先级unordered_map<char, int> pri{ {'+', 0}, {'-', 0}, {'*', 1}, {'/', 1}, {'^', 2}, {'(', MAX_PRI }, {')', MAX_PRI}};unordered_map<char, function<double(double, double)>> func{{'+', [](double x, double y) -> double { return x + y; }},{'-', [](double x, double y) -> double { return x - y; }},  {'*', [](double x, double y) -> double { return x * y; }},{'/', [](double x, double y) -> double { return x / y; }},{'^', [](double x, double y) -> double { return pow(x, y); }}};string exp;cin >> exp;auto calculate = [&_data, &_operator, &func]() {char op = _operator.top();_operator.pop();double x = _data.top();_data.pop();double y = _data.top();_data.pop();_data.push(func[op](y, x));   //运算顺序与出栈顺序相反};auto stringtonum = [&exp, &pri](int& i) -> double {int j = i + 1;while (j < exp.length() && pri.find(exp[j]) == pri.end()) j++;double num = stod(exp.substr(i, j - i));i = j - 1;   return num;};for (int i = 0; i < exp.length(); ++i) {char e = exp[i];if (pri.find(e) == pri.end()) {   //当前字符不是运算符,则切割数字_data.push(stringtonum(i));} else if (e == '(') {_operator.push('(');} else if (e == ')') {while (_operator.top() != '(') {calculate();}_operator.pop();} else {//当前运算符优先级<=栈顶运算符优先级,则出栈计算while (!_operator.empty() && pri[_operator.top()] >= pri[e] && _operator.top() != '(') {calculate();}_operator.push(e);}}while (!_operator.empty()) {calculate();}cout << _data.top() << endl;
}

http://www.lryc.cn/news/213929.html

相关文章:

  • 面试算法45:二叉树最低层最左边的值
  • Could not find org.jetbrains.kotlin:kotlin-stdlib-jre7:1.5.21.
  • LoRaWan之LoRaMAC 的快速入门指南
  • 中国教育企业出海 新兴技术助力抢占先机
  • IntelliJ IDEA2023旗舰版和社区版下载安装教程(图解)
  • 【RxJava】map过程中各个Observable生命周期分析
  • vue 获取上一周和获取下一周的日期时间
  • 线性代数 第四章 线性方程组
  • @DateTimeFormat和@JsonFormat注解
  • 做抖音短视频会经历哪些阶段?
  • 【Mquant】2、量化平台的选择
  • iPhone手机如何恢复删除的视频?整理了3个好用方法!
  • 全网最全的RDMA拥塞控制入门基础教程
  • 分布式消息队列:RabbitMQ(1)
  • Redis集群脑裂
  • GEE教程——随机样本点添加经纬度信息
  • PyTorch入门学习(十):神经网络-非线性激活
  • 《golang设计模式》第三部分·行为型模式-03-解释器模式(Interpreter)
  • Windows个性化颜色睡眠后经常改变
  • calico ipam使用
  • Redis系统学习(高级篇)-Redis持久化-AOF方式
  • 云安全-云原生基于容器漏洞的逃逸自动化手法(CDK check)
  • 精选10款Python可视化工具,请查收
  • 大数据(21)-skew-GroupBy
  • window压缩包安装mongodb并注册系统服务
  • 【Java每日一题】——第四十五题:综合案例:模拟物流快递系统。(2023.11.1)
  • 二十二、Arcpy批量波段组合——结合Landat数据城市建成区提取
  • 电脑上数据恢复的详细操作
  • 3.1 linux控制内核打印printk demsg DEBUG
  • 关于爬虫API常见的技术问题和解答