您的位置:首页 > 其它

栈实现简单的四则运算表达式

2015-01-19 17:00 716 查看
支持 + - * / ^ ()

#include<iostream>
#include<cstring>
#include<string>
#include<stack>
#include<cmath>
#include<cstdio>
using namespace std;

stack<int> opnd; //操作数栈
stack<char> optr; //算术符栈
string expression; //存放表达式

//返回两算术符a和b的优先关系
char Compare(char a,char b)
{
if('#' == a)
{
if('#'== b)
return '=';
else
return '<';
}

if('+'== a || '-'== a)
{
if('*'== b || '/'== b || '^'== b || '('== b)
return '<';
else
return '>';
}

if('*'== a || '/'== a)
{
if('('== b || '^'== b)
return '<';
else
return '>';
}

if('^'== a)
{
// 2^3^2 相当于2^(3^2)
if('^' == b || '(' == b )
return '<';
else
return '>';
}

if('('== a)
{
if(')'== b)
return '=';
else
return '<';
}
}

//返回计算结果
int Calculate(int a,int b,char op)
{
switch (op)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
case '^':
return pow(a,b);
}
}

//是否是运算符
bool Isoptr(char c)
{
static string oprator("+-*/^()#");
//没找到返回 npos
if(oprator.find(c) == string::npos)
{
return false;
}
return true;
}

//求值过程
int EvaluateExpression()
{
int i=0,num=0;
while ( expression[i]!='#' || optr.top()!='#' )
{
if( !Isoptr(expression[i]) )
{
//不是算术符,则是操作数
num=0;
while( !Isoptr(expression[i]) )
{
//求得此操作数
num *= 10;
num += expression[i]-'0';
++i;
}
opnd.push(num);
}
else
{
//运算符栈顶元素 与 表达式当前的 运算符相比较
switch (Compare(optr.top(),expression[i] ))
{
case '<':
optr.push(expression[i]);
++i;
break;
//小括号丢掉
case '=':
optr.pop();
++i;
break;
case '>':
int a = opnd.top(); opnd.pop();
int b = opnd.top(); opnd.pop();
printf("%d%c%d=%d\n",b,optr.top(),a,Calculate(b,a,optr.top()));
opnd.push(Calculate(b,a,optr.top())); //注意 a 和 b 的顺序
optr.pop();
break;
}
}
}
optr.push('#');//表达式最左边录入一个 ’#‘,形成一对 '#'
int res=opnd.top();
opnd.pop();
return res;
}

int main()
{
/*在表达式最左边增加一个'#,'形成一对 '#'
同时当表达式输入完后在录入一个’#‘表示结束
*/
optr.push('#');
int count=0;
while ( cin>>expression )
{
int sum=expression.size();
expression[sum]='#';
++count;
cout<<"Case "<<count<<":"<<EvaluateExpression()<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: