博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【足迹C++primer】表达式求值
阅读量:6877 次
发布时间:2019-06-26

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

表达式求值

/*** 功能:表达式求值(0到9)* 时间:2014年6月15日08:02:31* 作者:cutter_point*/#include
#include
#include
#include
using namespace std;stack
intStack; //存放数值的栈stack
charStack; //存放运算符string OP="+-*/()#"; //等会用finf_first_of来找出来全部的数string shuzhi="0123456789";//推断运算符的优先级,c1表示前面元素,c2在c1之后char isFirst(char c1, char c2){ char res='#'; switch(c1) { case '+': case '-': //推断前面是+和-的情况 switch(c2) { case '+': case '-': case ')': case '#': res='>'; //加减的优先级比他们高,碰到就让前面的出栈计算 break; case '*': case '/': case '(': res='<'; //加减的优先级比他们低,当碰到的时候直接进栈 break; } break; case '*': case '/': //推断前面是*和/的情况 switch(c2) { case '(': res='<'; break; default: res='>'; break; } break; case '(': switch(c2) { case ')': res='='; break; default: res='<'; break; } break; case ')': res='>'; break; case '#': switch(c2) { case '#': res='='; break; default: res='<'; break; } break; } return res;}//推断是否是运算符bool In(char c, string OP){ bool b=false; for(string::iterator it=OP.begin() ; it != OP.end() ; ++it) { if(c == *it) { b=true; break; } } return b;}//得到计算结果int countResult(int a, char opera, int b){ int res=0; switch(opera) { case '+': res=a+b; break; case '-': res=a-b; break; case '*': res=a*b; break; case '/': res=a/b; break; } return res;}int result(string s){ //得到算术表达式的值 //首先让charStack栈的栈顶变为'#' charStack.push('#'); //循环对栈进行操作 string::iterator it=s.begin(); while(it != s.end()) { if(!In(*it, OP)) { //首先把字符转化成数字 int a=*it-'0'; intStack.push(a); ++it; } else { switch(isFirst(charStack.top(), *it)) { case '<': //优先级比前面的小,那就直接进栈 charStack.push(*it); ++it; break; case '=': charStack.pop();//弹出栈顶元素,脱括号继续循环 ++it; break; case '>': //对栈进行各种操作,退栈并将运算结果入栈 int b=intStack.top(); //得到前面一个数值 intStack.pop(); //吧栈顶的元素删除 int a=intStack.top(); //得到第二个数字 intStack.pop(); //删除栈顶元素 //取出运算符号 char opera=charStack.top(); //得到栈顶元素 charStack.pop(); //删除栈顶元素 //进行计算 intStack.push(countResult(a, opera, b)); break; }//switch }//else }//while cout<<"结果是:"<
<
>s) { cout<<"计算结果是:"<
測试数据:
9+8/4*(2+1)/2#
输出结果是:
12
大笑这个表达式哪里来的?反正不是我自己想的,是一位大神用来測试他的算术表达式的,我就拿来測试我的程序呗
大笑
注意:输入表达式后一定要加一个#才干够!!!
PS:蛋疼死了,明明早就成功了,结果codeblocks由于路径不能是中文搞得我没法调试,浪费时间,还有就是開始得到的老是错误结果,然后我就把程序断点运行了一遍之后,就该了一块地方,可是我认为应该没影响的地方啊!!!然后竟然就成功了!!!!吓尿,还有就是一定要输入完算术表达式后加一个#表示输入结束,不然是得不到正确结果的!!!
你可能感兴趣的文章
指责和分享
查看>>
查询同一表内多字段同时重复记录的SQL语句
查看>>
(.公司)域名2015年度报告:仅一家注册量过万
查看>>
关于红黑树的学习笔记
查看>>
阿里云异构计算产品是如何保障双11业务的
查看>>
ICO身份核实KYC
查看>>
分贝计算
查看>>
Ubuntu上安装锐利清晰的文泉驿正黑字体
查看>>
Xshell在vim中不能使用小键盘的问题
查看>>
贴几个自己写的BigIP F5的iRule
查看>>
2013 China Hadoop Summit杂记
查看>>
CMAKE安装MYSQL 5.6.10
查看>>
linux日常管理常用命令--w
查看>>
我的友情链接
查看>>
memcached常用命令详解
查看>>
inotify + rsync 实时同步
查看>>
远程登录linux主机更换IP地址【非交互】
查看>>
Hyperledger Fabric初识与环境搭建
查看>>
漫谈培训之高效培训——让鸡肋变成鸡排
查看>>
使用Configuration Manager配置报表服务
查看>>