问题 A: 简单计算器

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

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

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

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

样例输出 Copy
12178.21

补充
先分析一类仅由两种运算符号,和三个运算数构成的相对简单的算术表达式,比如2+3*4,他的基本类型是a1,op1,a2,op2,a3,op3(a为运算数,op为运算符)
一般计算机编译的时候都是从左到右扫描,扫描了a1 op1 a2找到两个运算数和一个运算符号后,无法马上计算,因为还要看op2的优先级,所以,编译程序从左到右扫描时,需要根据前后运算优先级的情况决定的,先保留当前数据和运算符号,还是马上计算。
后缀表达式可以很好地解决这种问题,运算符号位于两个运算数后面。

5+6/2-34->562/+34-

  1. 遇见562时均不做计算,同时记住这个序列562
  2. 当遇见运算符“/”,把最近的两个数字6和2从序列中取出作运算,并把计算结果3放入刚刚的序列后面,此时序列为53
  3. 遇见运算符“+”,把序列最后的两个数53取出作运算,并把计算结果8放到当前序列后面,此时序列为8
  4. 遇见34均不作计算,把这两个数放到当前序列后面,当前序列为834
  5. 遇见运算符“*”,把当前序列最后两个数34作运算,并把结果12放到当前序列的后面,当前序列8 12
  6. 遇见运算符“-”,把当前的最后两个数8 12取出作运算,并把结果-4放到当前序列后面,当前序列-4
#include <iostream>
#include <cstdio>
#include <string>
#include <stack>
#include <queue>
#include <map>

struct node {
	double num;
	char op;
	bool flag;
};

string str;
stack<node> s;
queue<node> q;
map<char, int> op;

void Change() {		//转化成后缀表达式
	node temp;
	for(int i  = 0; i < str.length();)
	 {
		if(str[i] >= '0' && str[i] <= '9') 
		{		//操作数
			temp.flag = true;
			temp.num = str[i++] - '0';
			while(i < str.length() && str[i] >= '0' && str[i] <= '9') 
			{
				temp.num = temp.num * 10 + (str[i] - '0');
				i++;
			}
			q.push(temp);
		}
		else {			//不是为操作符
			temp.flag= false;
			while(!s.empty() && op[str[i]] <= op[s.top().op]) //操作符就和栈顶的操作符优先级比较,若大于栈顶优先级,则直接压入栈
			{
				q.push(s.top());
				s.pop();
			}
			temp.op = str[i];//小于等于栈顶优先级,则把栈顶弹出到队列中,再比较,直到优先级大于栈顶,压入栈
			s.push(temp);
			i++;
		}
	}
	while(!s.empty()) {			//将栈中剩余操作符存入队列
		q.push(s.top());
		s.pop();
	}
}

double Cal() {			//计算中缀表达式的值
	double temp1, temp2;
	node cur, temp;
	while(!q.empty()) {
		cur = q.front();
		q.pop();
		if(cur.flag == true)		//若为操作数,压入栈
			s.push(cur);
		else {						//若为操作符,弹出栈中两个操作数,计算
			temp2 = s.top().num;	//注意:先弹出的为第二操作数
			s.pop();
			temp1 = s.top().num;
			s.pop();
			temp.flag = true;
			if(cur.op == '+')
				temp.num = temp1 + temp2;
			else if(cur.op == '-')
				temp.num = temp1 - temp2;
			else if(cur.op == '*')
				temp.num = temp1 * temp2;
			else
				temp.num = temp1 / temp2;
			s.push(temp);
		}
	}
	return s.top().num;
}

int main() {
	op['+'] = op['-'] = 1;
	op['*'] = op['/'] = 2;
	while(getline(cin, str), str != "0") //getline读入字符串包括空格,当读入的字符串是0的时候结束输入 
	{
		string::iterator it;
		for(it = str.begin(); it != str.end(); it++) //对每一个字符串从头到尾读入 
		{
			if(*it == ' ')//删除空格 
				str.erase(it);
		}
		while(!s.empty())
			s.pop();//
		Change();
		printf("%.2f\n", Cal());
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是一道数学问题,可以回答。下面是一个简单的 Python 代码实现: ``` a, b, op = input().split() a, b = int(a), int(b) if op == '+': print(a + b) elif op == '-': print(a - b) elif op == '*': print(a * b) elif op == '/': if b == 0: print("抱歉,除数不能为零") else: print(a / b) else: print("无效的运算符") ``` 你可以输入两个数字和运算符,程序会自动计算结果并输出。注意,除法运算时,需要注意除数不能为零的情况。 ### 回答2: Python编程:简易计算器 这是一个简易计算器的Python程序,程序的第一行中读入两个数a和b以及一个运算符op,然后根据op进行相应的计算,输出结果。 首先,我们需要使用input()函数来读取输入的内容,并将其转换为对应的数据类型。代码如下: ``` a = float(input("请输入第一个数:")) b = float(input("请输入第二个数:")) op = input("请输入运算符(+、-、*、/): ") ``` 接下来,我们可以使用条件语句来判断输入的运算符op,并进行相应的计算操作。代码如下: ```python if op == "+": result = a + b elif op == "-": result = a - b elif op == "*": result = a * b elif op == "/": if b != 0: result = a / b else: result = "除数不能为0" else: result = "请输入正确的运算符(+、-、*、/)" print("计算结果为:", result) ``` 在上面的代码中,我们使用了四个if-elif-else语句来判断运算符op的值,并分别进行对应的计算操作。当op为+、-、*时,分别执行加、减、乘的运算,当op为/时,判断除数是否为0,如果不为0,则执行除法运算;如果为0,则输出"除数不能为0"的提示;如果op不是上述四种运算符,则输出"请输入正确的运算符(+、-、*、/)"的提示。 最后,我们使用print()函数将计算结果输出。程序的完整代码如下: ```python a = float(input("请输入第一个数:")) b = float(input("请输入第二个数:")) op = input("请输入运算符(+、-、*、/): ") if op == "+": result = a + b elif op == "-": result = a - b elif op == "*": result = a * b elif op == "/": if b != 0: result = a / b else: result = "除数不能为0" else: result = "请输入正确的运算符(+、-、*、/)" print("计算结果为:", result) ``` 这样,我们就完成了一个简易计算器的Python程序,可以根据输入的表达式进行相应的计算,并输出结果。 ### 回答3: Python编程:简易计算器 要实现该功能,我们可以按照以下步骤进行编程: 1. 使用`input()`函数从第一行读入两个数a和b及一个运算符op,分别存储在变量a、b和op中。 2. 首先设置一个结果变量result,初始值为0。 3. 使用条件语句判断op的值,根据不同的运算符进行相应的计算,并将结果赋给result。 - 如果op为'+', 则result = a + b - 如果op为'-', 则result = a - b - 如果op为'*', 则result = a * b - 如果op为'/', 则result = a / b 4.使用`print()`函数将计算结果输出。 下面是一个示例代码: ```python a, b, op = input().split() a = float(a) b = float(b) result = 0 if op == '+': result = a + b elif op == '-': result = a - b elif op == '*': result = a * b elif op == '/': result = a / b print(result) ``` 这段代码可以实现根据输入的两个数和运算符,计算出表达式的结果,并将结果输出。需要注意的是,我们将输入的字符串转换为浮点数类型,以保证计算结果的准确性。在程序中,使用了条件语句来判断运算符的类型,进而进行相应的计算,最终将结果赋给result并输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值