表达式求值
/**
* 功能:表达式求值(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
测试数据:
9+8/4*(2+1)/2#
输出结果是:
12
![大笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
![大笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
注意:输入表达式后一定要加一个#才可以!!!
PS:蛋疼死了,明明早就成功了,结果codeblocks因为路径不能是中文搞得我没法调试,浪费时间,还有就是开始得到的老是错误结果,然后我就把程序断点执行了一遍之后,就该了一块地方,但是我觉得应该没影响的地方啊!!!然后居然就成功了!!!!吓尿,还有就是一定要输入完算术表达式后加一个#表示输入结束,不然是得不到正确结果的!!!