题目1100: 简单计算器

题目描述

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

 


 

输入

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

 


 

输出

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

 


 

样例输入
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
0
 


 

样例输出
12178.21
 


 

提示 [+]

*** 提示已隐藏,点击上方 [+] 可显示 ***

 


 

来源
 

 

【思路】:

 

 

/********************************* 
 *    日期:2013-3-15
 *    作者:SJF0115 
 *    题号: 天勤OJ 题目1100: 简单计算器
 *    来源:http://www.acmclub.com/problem.php?id=1100(http://acm.hdu.edu.cn/showproblem.php?pid=1237)
 *    结果:AC 
 *    来源:2006年浙江大学计算机及软件工程研究生机试真题
 *    总结: 
**********************************/
#include<stdio.h>
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;
//算符优先级
char Precede(char c1,char c2){
	switch(c1){
	case '+':
	case '-':
		if(c2 == '*' || c2 == '/'){
			return '<';
		}
		else{
			return '>';
		}
		break;
	case '*':
	case '/':
		return '>';
		break;
	case '#':
		return '<';
		break;
	}
}
//运算
double Operate(double a,double b,char c){
	switch(c){
	case '+':
		return a + b;
		break;
	case '-':
		return a - b;
		break;
	case '*':
		return a * b;
		break;
	case '/':
		return a / b;
		break;
	}
}
int main(){
	int i,len,n;
	char str[1001];
    while(gets(str) && strcmp(str,"0") != 0){
		stack<char> OP;
		stack<double> Num;
		//#作为栈底元素
		OP.push('#');
		len = strlen(str);
		//输入串要以'#'开始和结束
		str[len] = '#';
		n = 0;
		for(i = 0;i <  len || OP.top() != '#';){
			//跳过空格
			if(str[i] == ' '){
				i++;
			}
			//数字
			else if(str[i] >= '0' && str[i] <= '9'){
				//提取运算数
				while(str[i] >= '0' && str[i] <= '9'){
					n = n * 10 + str[i] - '0';
					i++;
				}
				//数字入栈
				Num.push(n);
				n = 0;
			}
			//运算符
			else{
				//如果栈顶元素小,则把运算符压入栈
				if(Precede(OP.top(),str[i]) == '<'){
					OP.push(str[i]);
					i++;
				}
				//如果栈顶元素大,则弹出栈顶运算符,再从数字栈弹出两个栈顶数字,完成运算,再把运算结果压入栈。
				else if(Precede(OP.top(),str[i]) == '>'){
					double b = Num.top();
					Num.pop();
					double a = Num.top();
					Num.pop();
					char c = OP.top();
					OP.pop();
					double result = Operate(a,b,c);
					Num.push(result);
				}
			}
		}//for
		printf("%.2f\n",Num.top());
	}//while
	return 0;
}


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值