面试OR笔试36——计算算术表达式

61 篇文章 0 订阅
61 篇文章 0 订阅

题目及要求

1.1 题目描述

含有加减乘除四则运算以及括号的表达式(字符串),求该表达式的结果。

 

 

2 解答

2.1 题目分析

分解为简单的几个步骤,然后依次解决。

 

2.2 代码

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

// 计算单个运算符
double uniOp(double x1, double x2, char op) {
	switch (op) {
	case '*':return x1*x2;
	case '/':return x2 ? x1 / x2 : x1;
	case '+':return x1 + x2;
	case '-':return x1 - x2;
	}
	return x1;
}

// 计算不含括号的算式
double compute(const string &s) {
	istringstream ss(s);
	double res(0), tmp1, tmp2;
	char op1, op2;
	if (!(ss >> res && ss >> op1 && ss >> tmp1)) return res;
	while (ss >> op2 && ss >> tmp2) {
		if (op1 == '*' || op1 == '/' || op2 == '+' || op2 == '-') {
			res = uniOp(res, tmp1, op1);
			tmp1 = tmp2;
			op1 = op2;
		}
		else {
			tmp1 = uniOp(tmp1, tmp2, op2);
		}
	}
	return uniOp(res, tmp1, op1);
}

// 计算含括号的算式
double compute2(const string &s) {
	auto it2 = s.begin(), it1 = it2;
	for (;it2 != s.end();++it2) {
		if (*it2 == ')') break;
		if (*it2 == '(') it1 = it2;
	}
	if (it2 == s.end()) return compute(s);
	string s2 = s.substr(0, it1 - s.begin());
	s2 += to_string(compute(s.substr(it1 - s.begin()+1, it2 - it1)));
	s2 += s.substr(it2 - s.begin() + 1);
	return compute2(s2);
}
int main(int argc, char *argv[]) {
	string s1 = "((1+2)*3/((4-2)*2)+(2))";
	cout << compute2(s1);
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值