【足迹C++primer】表达式求值
表达式求值
/**
* 功能:表达式求值(0到9)
* 时间:2014年6月15日08:02:31
* 作者:cutter_point
*/ #include<stdlib.h>
#include<stack>
#include<iostream>
#include<string> using namespace std; stack<int> intStack; //存放数值的栈
stack<char> 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<<"结果是:"<<intStack.top()<<endl; return intStack.top();
} /*
//找到string看是否是运算符
bool isYunSuanFu(string s)
{
bool b=false; string::size_type pos=0; if(pos=s.find_first_of(OP, pos) != string::npos)
{
b=true;
} return b;
}
*/ int main()
{
string s;
cout<<"输入算术表达式:"<<endl;
while(cin>>s)
{
cout<<"计算结果是:"<<endl;
cout<<result(s)<<endl;
} // string::size_type pos=0;
// shuzhi.erase(pos,1); 删除的结果是123456789
// cout<<shuzhi; return 0;
} //蛋疼调试结束:2014年6月15日11:53:01


PS:蛋疼死了,明明早就成功了,结果codeblocks由于路径不能是中文搞得我没法调试,浪费时间,还有就是開始得到的老是错误结果,然后我就把程序断点运行了一遍之后,就该了一块地方,可是我认为应该没影响的地方啊!!!然后竟然就成功了!!!!吓尿,还有就是一定要输入完算术表达式后加一个#表示输入结束,不然是得不到正确结果的!!!
【足迹C++primer】表达式求值的更多相关文章
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
- 用Python3实现表达式求值
一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...
- nyoj305_表达式求值
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 数据结构--栈的应用(表达式求值 nyoj 35)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...
- NOIP2013普及组 T2 表达式求值
OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 #include<iostream> #include<algorithm> #include<cmat ...
- HNU 12817 Shipura(表达式求值)
题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12817 解题报告:定义两种运算符号,一种是>>,就 ...
- NOIP201302表达式求值
NOIP201302表达式求值 题目描述 Description 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 Input Description 输入仅有一行,为需要你计 ...
随机推荐
- 狗狗40题~(Volume B)
H - Sorting Slides 应该是个二分匹配的模板题的,但我还不会写 = = 其实数据规模很小,就用贪心的方法就水过了(没加vis判冲突wa了几发,从此开始艰难的没有1A 的生活) #inc ...
- SGU 185.Two shortest (最小费用最大流)
时间限制:0.25s 空间限制:4M 题意: 在n(n<=400)个点的图中,找到并输出两条不想交的最短路.不存在输出“No sulotion”: Solution: 最小费用最大流 建图与po ...
- SGU 190.Dominoes(二分图匹配)
时间限制:0.25s 空间限制:4M 题意: 给定一个N*N的棋盘,一些格子被移除,在棋盘上放置一些1*2的骨牌,判定能否放满,并且输出任意方案. Solution: 首先考虑对棋盘的一个格子黑白染色 ...
- 【BZOJ2049】【LCT】Cave 洞穴勘测
Description 辉 辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通 道组成,并且每条通道连接了 ...
- 『重构--改善既有代码的设计』读书笔记----Extract Class
在面向对象中,对于类这个概念我们应该有一个清晰的责任认识,就是每个类应该只有一个变化点,每个类的变化应该只受到单一的因素,即每个类应该只有一个明确的责任.当然了,说时容易做时难,很多人可能都会和我一样 ...
- spring + maven +testng 测试常见依赖包问题
java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法:添加缺少的jar包:commons-coll ...
- windows8.1 App中webView 使用定位
windows8.1的webview的网页中没有办法直接定位 要想定位比较费劲 查了好久才发现一个可行的办法 那就是通过后台代码获取位置信息 然后调用页面中已有的获取位置信息的JS方法 把位置信 ...
- GET和POST详解
GET和POST 表单提交方式 http的get提交方法把表单数据编码到url中,可以在浏览器地址栏中看到, post提交把表单数据编码到http请求包的正文部分,在url中啊可能不到数据
- Library:python-memcached on Windows
1 install memcached 1.4.4 Windows 32-bit 2 cd into the base file and type memcached.exe -d install ...
- MapReduce程序开发之流量求和(八)
1.分析记录手机流量的日志. 2.拿到日志中的一行数据,切分各个字段,抽取出我们需要的字段:手机号,上行流量,下行流量,然后封装成kv发送出去 3.使用java中的map方法: public clas ...