C++简单计算器实现(四则运算加括号)
来源:互联网 发布:怎样加盟农村淘宝网店 编辑:程序博客网 时间:2024/05/21 22:20
先说一下实现思路,使用两个栈,一个存放数字,一个存放运算符。这样比较运算符和取出运算的数字都非常方便。再者,在压入栈的过程中,把要压入的运算符和前一个运算符进行比较,如果优先级小于或者等于,就要将前一个运算符进行计算。
ps:支持带括号带负数四则运算。
#include <iostream>#include <string>#include <stack>using namespace std;stack<double> num_stk;stack<char> oper_stk;string experssion;double result;int number_flag;void pop_caculate();int cal_priority(char c);string::size_type get_number_size(string &expr,string::size_type currentPos);bool is_number(char c);void caculate(string expr);int main(){ cout << "input experssion!" << endl; while (cin >> experssion) { number_flag = 0; caculate(experssion); }}/* * get number length from currentPos of string expr*/string::size_type get_number_size(string &expr,string::size_type currentPos){ string numbers = "0123456789."; return expr.find_first_not_of(numbers,currentPos) - currentPos;} /* * char c is number?*/bool is_number(char c){ string numbers = "0123456789-"; if (numbers.find(c) == string::npos) { return false; } return true;}/* * the main caculate method*/void caculate(string expr){ string::size_type size = 0; double num = 0; for (string::size_type i=0;i<expr.size();) { if (number_flag == 0 && is_number(expr[i])) { num = stod(expr.substr(i)); if (expr[i] == '-') { ++i; num = -stod(expr.substr(i)); } size = get_number_size(expr,i); num_stk.push(num); i += size; cout << "num:" << num << endl; number_flag = 1; } else { number_flag = 0; if (oper_stk.empty()) { oper_stk.push(expr[i]); } else if (expr[i] == '(') { oper_stk.push(expr[i]); } else if (expr[i] == ')') { while (oper_stk.top() != '(') { pop_caculate(); } oper_stk.pop(); } else if (cal_priority(expr[i]) <= cal_priority(oper_stk.top())) { pop_caculate(); oper_stk.push(expr[i]); } else { oper_stk.push(expr[i]); } ++i; } } while (!oper_stk.empty()) { pop_caculate(); } result = num_stk.top(); cout << result << endl;}/* * pop and caculate the two stack to caculate*/void pop_caculate(){ double left=0,right=0,res=0; char oper = oper_stk.top(); right = num_stk.top(); num_stk.pop(); left = num_stk.top(); num_stk.pop(); oper_stk.pop(); if (oper == '+') res = left + right; else if (oper == '-') res = left - right; else if (oper == '*') res = left * right; else if (oper == '/') res = left / right; num_stk.push(res); cout << "caculate:" << left << oper << right << "=" << res << endl;}/* * caculate operator priority */int cal_priority(char c){ if (c == '(') return 0; else if (c == '+') return 1; else if (c == '-') return 2; else if (c == '*') return 3; else if (c == '/') return 4; return 0;}
0 0
- C++简单计算器实现(四则运算加括号)
- C语言 实现四则运算简单计算器
- QT,计算器实现(四则运算,括号,小数,负数)---(一)
- js实现简单计算器(四则运算)
- C语言实现四则运算(小型计算器)
- 简单四则运算计算器的C++实现(含括号和+-*/的优先级判断)
- 栈实现简单计算器的四则运算(STL)
- 科学计算器(可实现带括号的浮点数四则运算)
- 逆波兰式实现四则运算表达式计算器支持括号、十六进制
- 支持多位数,括号,四则运算,的计算器算法c++实现
- java简单计算器实现,只有四则运算
- 带括号的四则运算C语言实现
- 一个简单的四则运算程序C语言实现--实现处理括号
- 《简单计算器实现(c#)》
- 一个简单的四则运算程序C语言实现--无法处理括号
- 简单计算器(不支持括号)
- 基于51单片机设计简单计算器,实现6位有效四则运算的程序设计(汇编调用C)
- 简单四则运算计算器
- Java特性之多态详解
- 蓝牙之二十三-beacon
- Mybatis 学习
- [已解决]nginx: [emerg] invalid number of arguments in "root" directive in /etc/nginx/nginx.conf:45
- 4 编 码
- C++简单计算器实现(四则运算加括号)
- 【React Native开发】React Native进行签名打包成Apk(5)
- 贪心算法 汽车加油问题
- 集成百度地图sdk小白操作
- 历周移动开发周刊
- 通过BUG来理解STM32的HSE时钟
- 目前双因素认证厂商有哪些?该怎么选?
- 位带操作与OMAP-L138的举例分析
- 网络图片查看器