博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算表达式
阅读量:5019 次
发布时间:2019-06-12

本文共 1848 字,大约阅读时间需要 6 分钟。

粗糙的实现,能够完成“12*3+4*11/(2-5)*2”之类的整形运算。方法是通过两个栈,一个记录操作数,一个记录操作符,然后用map记录优先级。/和*的优先级要一样,否则会有4*11/2是22还是20这样的错误。括号的处理是"("入栈,")"开始回退到"("。因为除号的两个操作数有顺序,弹出栈的时候要注意。

#include 
#include
#include
#include
#include
using namespace std;// case:// 1+2*3+5-6/7 = 12// 12*3+4*11/2-5*2 = 48// 1+2*((3+(5-6)/1)+6)*3 = 49// 12*3+4*11/(2-5)*2 = 8map
pmap; // priority_mapvoid init(){ pmap.insert(make_pair('#', 0)); pmap.insert(make_pair('+', 1)); pmap.insert(make_pair('-', 1)); pmap.insert(make_pair('*', 2)); pmap.insert(make_pair('/', 2));}int get_pri(char c){ if (pmap.count(c) != 0) { return pmap[c]; } return -1;}int eval(char op, int num1, int num2){ if (op == '+') return num1 + num2; if (op == '-') return num1 - num2; if (op == '*') return num1 * num2; if (op == '/') return num1 / num2;}void operate(stack
&op_stack, stack
&num_stack){ int num2 = num_stack.top(); num_stack.pop(); int num1 = num_stack.top(); num_stack.pop(); char op = op_stack.top(); op_stack.pop(); int res = eval(op, num1, num2); num_stack.push(res);}int calc(string s){ s = s + '#'; stack
op_stack; stack
num_stack; for (int i = 0; i < s.length(); i++) { if (isdigit(s[i])) { int num = 0; int j = i; while (isdigit(s[j]) && j < s.length()) { num = num * 10 + (s[j] - '0'); j++; } num_stack.push(num); i = j - 1; } else if (s[i] == '(') { op_stack.push(s[i]); } else if (s[i] == ')') { while (op_stack.top() != '(') { operate(op_stack, num_stack); } op_stack.pop(); } else // '*', '/', '+', '-', '#' { while (!op_stack.empty() && get_pri(op_stack.top()) >= get_pri((s[i]))) { operate(op_stack, num_stack); } op_stack.push(s[i]); } } return num_stack.top();}int main() { init(); int c = calc("12*3+4*11/(2-5)*2"); cout << c << endl;}

  

转载于:https://www.cnblogs.com/lautsie/p/3427441.html

你可能感兴趣的文章
HIVE中的order by操作
查看>>
Centos下新建用户及修改用户目录
查看>>
iOS开发IPhone以及iPad尺寸汇总
查看>>
Spring Boot RestTemplate文件上传
查看>>
myBatis自动生成mapping,dao和model
查看>>
Android Serivce 高级篇AIDL讲解
查看>>
SpringBoot学习笔记(2):引入Spring Security
查看>>
图片加水印 PDF取缩略图
查看>>
bzoj 4180: 字符串计数
查看>>
安卓--布局设计-计算器
查看>>
Java重写《C经典100题》 --27
查看>>
ABP中的拦截器之EntityHistoryInterceptor
查看>>
【oracle】oracle数据库建立序列、使用序列实现主键自增
查看>>
使用SQLiteDatabase操作SQLite数据库第二种方法
查看>>
vue,一路走来(12)--父与子之间传参
查看>>
css3 选择器的比较(一) -- 以字符串开头
查看>>
实现交换两个变量值的第二种方法
查看>>
英语单词学习备忘转载
查看>>
【C++】单例模式详解
查看>>
文本框根据关键字异步搜索内容
查看>>