括号运算lv.3
  • 板块学术版
  • 楼主封禁用户
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/1/14 20:47
  • 上次更新2025/1/15 10:46:23
查看原帖
括号运算lv.3
1430277
封禁用户楼主2025/1/14 20:47

我看了上期评论,说无法处理负号,因为不是算法上的问题,所以本蒟蒻很快就干掉了

添了这个

double result=0.0;
		bool inNegative=false;
		while(index<expr.length()&&expr[index]=='-'){
			inNegative=!inNegative;
			index++;
		}
		if(inNegative){
			result=-parseTerm();
		}else{
			result=parseTerm();
		}

inNegative表示负号状态,false为假,true为真这样写-1+1甚至-(-3)就不会出BUG了

#include<iostream>
#include<string>
#include<cctype>
#include<cmath>
class Calculator{
public:
	double evaluate(const std::string& expresion){
		this->expr=expresion;
		this->index=0;
		return parseExpression();
	}
private:
	std::string expr;
	size_t index;
	
	double parseExpression(){
		double result=0.0;
		bool inNegative=false;
		while(index<expr.length()&&expr[index]=='-'){
			inNegative=!inNegative;
			index++;
		}
		if(inNegative){
			result=-parseTerm();
		}else{
			result=parseTerm();
		}
		while(index<expr.length() && (expr[index]=='+' || expr[index]=='-')){
			char op=expr[index++];
			double right=parseTerm();
			if(op=='+') result+=right;
			else result-=right;
		}
		return result;
	}
	double parseTerm(){
		double result=parseFactor();
		while(index<expr.length() && (expr[index]=='*' || expr[index]=='/')){
			char op=expr[index++];
			double right=parseFactor();
			if(op=='*') result*=right;
			else result/=right;
		}
		return result;
	}
	double parseFactor(){
		if(expr[index]=='('){
			index++;
			double result=parseExpression();
			index++;
			return result;
		}else{
			return parseNumber();
		}
	}
	double parseNumber(){
		size_t start=index;
		while(index<expr.length() && (std::isdigit(expr[index]) || expr[index]=='.')){
			index++;
		}
		return std::stod(expr.substr(start,index-start));
	}
};
int main(){
	Calculator calc;
	std::string expression;
	std::getline(std::cin,expression,'=');
	double result=calc.evaluate(expression);
	std::cout<<result;
	return 0;
}

后面啥也没变

2025/1/14 20:47
加载中...