简易计算器:算术表达式的计算
给出一组字符表达式,通过程序模拟计算器执行,最终得出运算结果。(没有考虑数字溢出场景)
- 输入:“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;
}
简易计算器:算术表达式的计算相关推荐
- js方------将字符串转换成算术表达式,并计算出结果,例如(‘92-4*5/3‘)
// 计算当前字符串是否是数字const isNumber = (val) => {const regPos = /^\d+(\.\d+)?$/ // 非负浮点数const regNeg = / ...
- 简易计算器(整数与浮点数(小数)分类输出)
[问题描述]输入一个整数算术表达式,计算它的值. [输入形式]输入一个算术表达式,两个操作数都是整数,操作数与操作符之间无空格. [输出形式]输出表达式的值,如果计算结果是整数,则输出结果也是整数:如 ...
- 编程题实训-实验2-基于栈的算术表达式求值算法(北京林业大学)
第1关:基于栈的中缀算术表达式求值 任务描述 本关任务:输入一个中缀算术表达式,求解表达式的值.运算符包括+.-.*./.(.).=,参加运算的数为double类型且为正数.(要求:直接针对中缀算术表 ...
- html算术计算,js实现计算器 提供算术表达式求值
//html 计算器 @import "calculator.css"; //CSS /* CSS Document */ body { /* padding-right:40 ...
- python表达式计算器_Python正则表达式实现简易计算器功能示例
本文实例讲述了Python正则表达式实现简易计算器功能.分享给大家供大家参考,具体如下: 需求:使用正则表达式完成一个简易计算器. 功能:能够计算简单的表达式. 如:1*2*((1+2)/(2+3)+ ...
- C++实现简易计算器(正则表达式计算)
说明:简单高效的C++代码,实现简易计算器(正则表达式计算),允许小数.括号.但没有表达式正误检验功能,所以测试前请确保式子正确哦 数据结构:栈 示范输入: ((1.5+2.5)*3-4)+5 42/ ...
- 字符串算术表达式求值-简单计算器实现(栈)-数据结构和算法(Java)
1 字符串算术表达式分类 字符串算术表达式分为前缀表达式.中缀表达式和后缀表达式.其中前缀表达式又称波兰表达式,后缀表达式基于前缀表达式,又称逆波兰表达式.下面给出百度百科关于几种表达式的定义: 前缀 ...
- 实验1:支持算术表达式求解的计算器
1. 项目概述 1.1 项目目标和主要内容 实现一个计算器软件. 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示:保存和浏览历史运算记录: 能够检验算术表达式的合法性 ...
- 栈趣用---中缀表达式实现简易计算器
中缀表达式:我们日常生活中用的表达式就是中缀表达式,比如4+5*6-7,它的特点就是人容易理解和计算,但是计算机不买账,对于中缀表达式,计算机实现起来复杂度很高,这里模拟了计算机计算中缀表达式过程,实 ...
最新文章
- JavaEE6入门02—Myeclipse8.5+GlassFish
- Java NIO总结
- tf.summary.FileWriter
- [Leetcode][第461题][JAVA][汉明距离][位运算][Brian Kernighan]
- mysql 分库分表mycat部署
- oslo_messaging使用eventlet executor时rpc无法调用的问题
- 模板引擎 Velocity语法
- xcode9无线调试都在这里
- 六自由度机械臂的正运动学解with RTB
- 1999-2019中国互联网发展二十年趋势
- insert into on duplicate key update
- 软件测试周刊(第50期):归结起来,焦虑的原因就两条:想同时做很多事情,又想立即看到效果。
- 加拿大鹅“跌倒”,波司登“吃饱”?
- 沟通的艺术:看人入里,看出人外 - part 1
- 智慧停车怎么实现的,停车场寻车是怎么实现的
- 利用棋盘格图案完成相机标定
- 【附源码】计算机毕业设计java学习资源共享网站设计与实现
- ibm服务器中文件存储设置,IBMv7000存储服务器双活配置流程
- Poj 2010-Moo University - Financial Aid
- Windows_U盘_SD卡_硬盘等存储介质无法完成格式化
热门文章
- 【vn.py】源码解析之双均线(Double Moving Average)策略以及策略底层实现
- 【PC工具】PDF文档转换工具,PDF转word,PDF转excel等格式,全方位PDF转换器
- 十分钟了解Web应用中数据库的基本概念
- UI设计网站 | 常用的UI设计网站大集合
- Python-cartopy兰伯特投影绘制场图
- 36 岁捧走图灵碗!80 岁算法大师高德纳要在 105 岁完结《计算机程序设计艺术》...
- jvm-日志分析工具gcviewer的使用
- 为什么现在的会员制仓储店都集体爆发了?
- window.print()打印时根据页面高度设置居中显示、设置打印布局(纵向、横向)
- ORACLE 表空间扩展方法,ORACLE 表空间扩展方法