输入一个由+、-、*、/、(、)和浮点数组成的合法表达式,计算并且输出其结果:
如输入:((1+2)*(2-1)+2-1*(1+1))时;
输出:3.000000
直接上代码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<stack>
#include<cmath>
using namespace std;
char mid[255];
stack<char> fuhao;
stack<double> shuzhi;
int compare(char a, char b){//运算符的优先级判定
int x, y;
switch(a){
case '\0': x = -1; break;
case '(': x = 0; break;
case '+':
case '-': x = 2;break;
case '*':
case '/':x = 3; break;
}
switch(b){
case '\0': y = 5; break;
case '(': y = 4; break;
case '+':
case '-': y = 2;break;
case '*':
case '/':y = 3; break;
}
if(x >= y) return 1;
else return 0;
}
double jisuan(double a,double b, char op){//传入值和运算符进行计算
switch(op){
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/':
if(b == 0){printf("error!! 除数为零\n");exit(0);}
return a / b;
}
return -1;
}
int mark = 0, point = 0, fwei = 0;
void count(char mid[]){
char x = mid[0];
int i = 1;
fuhao.push('\0');
shuzhi.push(0);
while(x != '\0' || fuhao.top() != '\0'){
if((x>='0' && x <='9') || x == '.'){
mark = 1;
if(x == '.') {x = mid[i++];point = 1;fwei = 0;continue;}//如果有小数点
if(point == 0){
if(mark == 1) shuzhi.push(x - '0');
else shuzhi.push(shuzhi.top()*10+(x -'0'));
x = mid[i++];
}
else if(point == 1){
fwei++;
double chulai = shuzhi.top();shuzhi.pop();
shuzhi.push(chulai+double((x-'0')/(pow(10.0,fwei))));
x = mid[i++];
}
}
else{
if(x == ' ') {x = mid[i++];continue;mark = 0; point = 0;}
else if(x == ')'){
while(fuhao.top() != '('){
double b = shuzhi.top();shuzhi.pop();
double a = shuzhi.top();shuzhi.pop();
double yaru = jisuan(a, b, fuhao.top());
shuzhi.push(yaru);
fuhao.pop();
}
fuhao.pop();
x = mid[i++];
mark = 0; point = 0;
}
else if(x == '\0'){
while(fuhao.top() != '\0'){
double b = shuzhi.top();shuzhi.pop();
double a = shuzhi.top();shuzhi.pop();
double yaru = jisuan(a, b, fuhao.top());
shuzhi.push(yaru);
fuhao.pop();
}
mark = 0; point = 0;
}
else{
while(compare(fuhao.top(), x)){//若栈顶元素优先级高些
double b = shuzhi.top();shuzhi.pop();
double a = shuzhi.top();shuzhi.pop();
double yaru = jisuan(a, b, fuhao.top());
shuzhi.push(yaru);
fuhao.pop();
}
fuhao.push(x);
x = mid[i++];
mark = 0; point = 0;
}
}
}
}
int main(){
printf("请输入表达式:\n");
gets(mid);
count(mid);//计算表达式
printf("%f", shuzhi.top());
return 0;
}