标签:
表达式计算模板:
包含+,-,*,/,(),^ 处理,但没有高精度。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#include<cctype>
#include<cstdlib>
using namespace std;
const int N=1000;
char _stack[N];//运算符的栈
int top;//初始化为-1
int _pow(int x,int y)
{
if(y==0) return 1;
if(y==1) return x;
int cnt;
cnt=_pow(x,y/2);
cnt=cnt*cnt;
if(y&1) cnt*=x;
return cnt;
}
void _change(string &str,string &res)//第一个参数为中缀表达式,第二个为后缀表达式,初始为空
{
top=-1;
int len=str.size();
for(int i=0;i<len;i++)
{
switch(str[i])
{
case ‘(‘:_stack[++top]=‘(‘;break;
case ‘+‘:
case ‘-‘:while(top>=0&&_stack[top]!=‘(‘)
res+=_stack[top--];
_stack[++top]=‘ ‘;//空格很重要 分隔数字的
_stack[++top]=str[i];
break;
case ‘*‘:
case ‘/‘:while(top>=0&&_stack[top]!=‘(‘&&_stack[top]!=‘+‘&&_stack[top]!=‘-‘)
res+=_stack[top--];
_stack[++top]=‘ ‘;
_stack[++top]=str[i];
break;
case ‘^‘:while(top>=0&&_stack[top]!=‘(‘&&_stack[top]!=‘+‘&&_stack[top]!=‘-‘&&_stack[top]!=‘*‘&&_stack[top]!=‘/‘)
res+=_stack[top--];
_stack[++top]=‘ ‘;
_stack[++top]=str[i];
break;
case ‘)‘:while(_stack[top]!=‘(‘)
res+=_stack[top--];
top--;
break;
default:res+=str[i];
if(i==len-1) res+=‘ ‘;
else if(!isdigit(str[i+1])) res+=‘ ‘;
}
}
while(top>=0)
{
res+=_stack[top--];
}
}
int _value(string str)//参数为后缀表达式
{
int cnt,len=str.size();
top=-1;
int _digit[N];
for(int i=0;i<len;i++)
{
switch(str[i])
{
case ‘ ‘:break;//空格很重要 分隔数字的
case ‘+‘:cnt=_digit[top-1]+_digit[top];
_digit[--top]=cnt;
break;
case ‘-‘:cnt=_digit[top-1]-_digit[top];
_digit[--top]=cnt;
break;
case ‘*‘:cnt=_digit[top-1]*_digit[top];
_digit[--top]=cnt;
break;
case ‘/‘:cnt=_digit[top-1]/_digit[top];//此题为整除,因题而异
_digit[--top]=cnt;
break;
case ‘^‘:cnt=_pow(_digit[top-1],_digit[top]);
_digit[--top]=cnt;
break;
default:string temp;
while(i<len&&isdigit(str[i])) temp+=str[i],i++;i--;
_digit[++top]=atoi(temp.c_str());
}
}
return _digit[0];
}
int main()
{
string str,res;
while(cin>>str)
{
res.clear();
_change(str,res);
int cnt=_value(res);
printf("%d\n",cnt);
}
return 0;
}
/*
1*2+3*4+5+6*7
*/
标签:
原文地址:http://www.cnblogs.com/forgot93/p/4385281.html