给出一组字符表达式,通过程序模拟计算器执行,最终得出运算结果。(没有考虑数字溢出场景)

  • 输入:“60 + 34 * 2 / 4 – 5”
  • 输出:72
  • 存储示例:str {“60”,“+”,“34”,“*”,“2”,“/”,“4”,“-”,“5”}

将中缀表达式转为后缀表达式,然后计算后缀表达式的值,用栈实现。

//将中缀表达式转为后缀表达式,然后计算后缀表达式的值(用栈实现)
#include<iostream>
#include<stack>
#include<vector>
#include<string>
using namespace std;//后缀表达式的计算
int Sum(vector<string>& str) {stack<int> st;   //存放操作数int i = 0;    //指向字符串数组while (i < str.size()) {//如果是操作符,则将栈顶元素和它的前一个元素出栈做运算,先出栈的为右操作数if (str[i] == "+" || str[i] == "-" || str[i] == "*" || str[i] == "/") {int right = st.top();  st.pop();int left = st.top(); st.pop();if (str[i] == "+")  st.push(left + right);else if (str[i] == "-")  st.push(left - right);else if (str[i] == "*")  st.push(left * right);else if (str[i] == "/")  st.push(left / right);}//如果是操作数,则入栈elsest.push(stoi(str[i]));++i;}return st.top();
}//中缀表达式转后缀表达式
void expression(vector<string>& str, vector<string>& expstr) { stack<string> st;  //存放操作符int i = 0;while (i < str.size()) {if (str[i] == "+" || str[i] == "-" || str[i] == "*" || str[i] == "/") {   //如果是操作符,则将栈中优先级高于或等于当前操作符出栈,加入后缀表达式while (!st.empty()) {if (st.top() == "(")break;if ((str[i] == "+" || str[i] == "-") && (st.top() == "+" || st.top() == "-" || st.top() == "*" || st.top() == "/")) {expstr.push_back(st.top());st.pop();  //出栈}else if ((str[i] == "*" || str[i] == "/") && (st.top() == "*" || st.top() == "/")) {expstr.push_back(st.top());st.pop();  //出栈}else    //如果栈中没有优先级高于或等于当前操作符,则终止break;}st.push(str[i]);  //当前运算符入栈}else if (str[i] == "(") {   //如果是"("st.push(str[i]);}else if (str[i] == ")")  //如果是")",依次弹出栈中操作符加入后缀表达式,直至遇到"("{while (!st.empty()) {if (st.top() == "(")break;expstr.push_back(st.top());  //加入后缀表达式st.pop();  //出栈}st.pop();   //"("不加入后缀表达式}else   //遇到操作数,直接加入后缀表达式expstr.push_back(str[i]);++i;   //后移}//遍历完所有字符后,将栈中剩余操作符出栈,加入后缀表达式while (!st.empty()) {expstr.push_back(st.top());st.pop();}
}//字符串转中缀表达式
void str2arr(string& s, vector<string>& str) {string tmp;int i = 0;while (i < s.size()) {if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/'|| s[i]=='('|| s[i]==')')tmp = s[i++];else {while ((s[i] != '+' && s[i] != '-' && s[i] != '*' && s[i] != '/' && s[i] != '(' && s[i] != ')') && i<s.size())tmp += s[i++];}str.push_back(tmp);tmp = "";}
}int main() {vector<string> expstr;  //存放后缀表达式vector<string> str;   //存放中缀表达式string s;  //存放字符串cin >> s;  //输入四则运算表达式str2arr(s,str);   //中缀表达式/*for (auto& e : str) {cout << e;}cout << endl;*/expression(str,expstr);  //中缀转后缀/*for (auto& e : expstr) {cout << e;}cout << endl;*/int sum = Sum(expstr);   //后缀表达式计算cout << sum << endl;  //输出结果system("pause");return 0;
}

简易计算器:算术表达式的计算相关推荐

  1. js方------将字符串转换成算术表达式,并计算出结果,例如(‘92-4*5/3‘)

    // 计算当前字符串是否是数字const isNumber = (val) => {const regPos = /^\d+(\.\d+)?$/ // 非负浮点数const regNeg = / ...

  2. 简易计算器(整数与浮点数(小数)分类输出)

    [问题描述]输入一个整数算术表达式,计算它的值. [输入形式]输入一个算术表达式,两个操作数都是整数,操作数与操作符之间无空格. [输出形式]输出表达式的值,如果计算结果是整数,则输出结果也是整数:如 ...

  3. 编程题实训-实验2-基于栈的算术表达式求值算法(北京林业大学)

    第1关:基于栈的中缀算术表达式求值 任务描述 本关任务:输入一个中缀算术表达式,求解表达式的值.运算符包括+.-.*./.(.).=,参加运算的数为double类型且为正数.(要求:直接针对中缀算术表 ...

  4. html算术计算,js实现计算器 提供算术表达式求值

    //html 计算器 @import "calculator.css"; //CSS /* CSS Document */ body { /*   padding-right:40 ...

  5. python表达式计算器_Python正则表达式实现简易计算器功能示例

    本文实例讲述了Python正则表达式实现简易计算器功能.分享给大家供大家参考,具体如下: 需求:使用正则表达式完成一个简易计算器. 功能:能够计算简单的表达式. 如:1*2*((1+2)/(2+3)+ ...

  6. C++实现简易计算器(正则表达式计算)

    说明:简单高效的C++代码,实现简易计算器(正则表达式计算),允许小数.括号.但没有表达式正误检验功能,所以测试前请确保式子正确哦 数据结构:栈 示范输入: ((1.5+2.5)*3-4)+5 42/ ...

  7. 字符串算术表达式求值-简单计算器实现(栈)-数据结构和算法(Java)

    1 字符串算术表达式分类 字符串算术表达式分为前缀表达式.中缀表达式和后缀表达式.其中前缀表达式又称波兰表达式,后缀表达式基于前缀表达式,又称逆波兰表达式.下面给出百度百科关于几种表达式的定义: 前缀 ...

  8. 实验1:支持算术表达式求解的计算器

    1. 项目概述 1.1 项目目标和主要内容 实现一个计算器软件. 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示:保存和浏览历史运算记录: 能够检验算术表达式的合法性 ...

  9. 栈趣用---中缀表达式实现简易计算器

    中缀表达式:我们日常生活中用的表达式就是中缀表达式,比如4+5*6-7,它的特点就是人容易理解和计算,但是计算机不买账,对于中缀表达式,计算机实现起来复杂度很高,这里模拟了计算机计算中缀表达式过程,实 ...

最新文章

  1. JavaEE6入门02—Myeclipse8.5+GlassFish
  2. Java NIO总结
  3. tf.summary.FileWriter
  4. [Leetcode][第461题][JAVA][汉明距离][位运算][Brian Kernighan]
  5. mysql 分库分表mycat部署
  6. oslo_messaging使用eventlet executor时rpc无法调用的问题
  7. 模板引擎 Velocity语法
  8. xcode9无线调试都在这里
  9. 六自由度机械臂的正运动学解with RTB
  10. 1999-2019中国互联网发展二十年趋势
  11. insert into on duplicate key update
  12. 软件测试周刊(第50期):归结起来,焦虑的原因就两条:想同时做很多事情,又想立即看到效果。
  13. 加拿大鹅“跌倒”,波司登“吃饱”?
  14. 沟通的艺术:看人入里,看出人外 - part 1
  15. 智慧停车怎么实现的,停车场寻车是怎么实现的
  16. 利用棋盘格图案完成相机标定
  17. 【附源码】计算机毕业设计java学习资源共享网站设计与实现
  18. ibm服务器中文件存储设置,IBMv7000存储服务器双活配置流程
  19. Poj 2010-Moo University - Financial Aid
  20. Windows_U盘_SD卡_硬盘等存储介质无法完成格式化

热门文章

  1. 【vn.py】源码解析之双均线(Double Moving Average)策略以及策略底层实现
  2. 【PC工具】PDF文档转换工具,PDF转word,PDF转excel等格式,全方位PDF转换器
  3. 十分钟了解Web应用中数据库的基本概念
  4. UI设计网站 | 常用的UI设计网站大集合
  5. Python-cartopy兰伯特投影绘制场图
  6. 36 岁捧走图灵碗!80 岁算法大师高德纳要在 105 岁完结《计算机程序设计艺术》...
  7. jvm-日志分析工具gcviewer的使用
  8. 为什么现在的会员制仓储店都集体爆发了?
  9. window.print()打印时根据页面高度设置居中显示、设置打印布局(纵向、横向)
  10. ORACLE 表空间扩展方法,ORACLE 表空间扩展方法