题目链接:http://lx.lanqiao.cn/problem.page?gpid=T419
问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
atof函数讲解:
头文件:#include <stdlib.h>
函数 atof() 用于将字符串转换为双精度浮点数(double),其原型为:
double atof (const char* str);
atof() 的名字来源于 ascii to floating point numbers 的缩写,它会扫描参数str字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。参数str 字符串可包含正负号、小数点或E(e)来表示指数部分,如123. 456 或123e-2。
【返回值】返回转换后的浮点数;如果字符串 str 不能被转换为 double,那么返回 0.0。
函数 atof() 用于将字符串转换为双精度浮点数(double),其原型为:
double atof (const char* str);
atof() 的名字来源于 ascii to floating point numbers 的缩写,它会扫描参数str字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。参数str 字符串可包含正负号、小数点或E(e)来表示指数部分,如123. 456 或123e-2。
【返回值】返回转换后的浮点数;如果字符串 str 不能被转换为 double,那么返回 0.0。
思路:根据符号的优先级进行运算,本代码实现为定义两个运算函数
include<cstdio>
#include<stack>
#include<string>
#include<cstring>
#include<cmath>
#include<ctype.h>
using namespace std;
stack <char> sCh; //用于存放符号的符号栈
stack <double> sNum;//用于存放数据的数据栈
char num[105];
char str1[105];
void cal_1()//接受加减乘除
{
double n1,n2;
char ch;
ch=sCh.top();
while(ch!='('){
n1=sNum.top();
sNum.pop();
n2=sNum.top();
sNum.pop();
switch(ch){
case '+':
n2+=n1;
break;
case '-':
n2-=n1;
break;
case '*':
n2*=n1;
break;
case '/':
n2/=n1;
break;
}
sNum.push(n2);//将新的结果入栈
sCh.pop();//删除用过的符号
ch=sCh.top();
}
}
void cal_2()
{
double n1,n2;
char ch;
ch=sCh.top();
while(ch =='*' || ch =='/'){
n1=sNum.top();
sNum.pop();
n2=sNum.top();
sNum.pop();
if(ch == '*'){
n2*=n1;
}else if(ch == '/'){
n2/=n1;
}
sNum.push(n2);
sCh.pop();
ch=sCh.top();
}
}
int main()
{
int k=0;
double n;
gets(str1);
char c[2]="=";
strcat(str1,c);
sCh.push('(');//现将最低优先级的左括号入栈
for(int i=0; str1[i]; ++i){
if(str1[i]>='0' && str1[i]<='9' || str1[i]=='.'){
num[k++]=str1[i];
continue;
}
num[k]=0;//在尾部添加字母用于atof函数读取数字 注意这里的数字0存到数组里是字母‘a’可以理解为结束标志
if(num[0]!=0){
n=atof(num);
num[0]=0;
sNum.push(n);
}
k=0; //下标归零
switch(str1[i]){
case '+' :
cal_1();
sCh.push('+');
break;
case '-' :
cal_1();
sCh.push('-');
break;
case '*' :
cal_2();
sCh.push('*');
break;
case '/' :
cal_2();
sCh.push('/');
break;
case '(' :
sCh.push(str1[i]);
break;
case ')' :
cal_1();
sCh.pop();
break;
case '=' :
cal_1();
sCh.pop();
break;
}
}
printf("%.0lf",sNum.top());
return 0;
}