蓝桥杯--算法训练 表达式计算


题目链接:http://lx.lanqiao.cn/problem.page?gpid=T419


问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

atof函数讲解:
头文件:#include

函数 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
#include
#include
#include
#include
#include

using namespace std;

stack  sCh; //用于存放符号的符号栈
stack  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;
}



你可能感兴趣的:(蓝桥杯训练)