题解 | 计算表达式
计算表达式
https://www.nowcoder.com/practice/7b18aa6b7cc14f8eaae6b8acdebf890b
#include "stdio.h" #include "map" #include "stack" #include "string" using namespace std; int main(){ // 定义输入表达式的字符数组 char inputExpression[1000]={0}; // 第一步:定义运算符优先级映射 map<char,int> priority={ {'\0',0}, // 字符串结束符,最低优先级 {'+',1},{'-',1}, // 加减法,低优先级 {'*',2},{'/',2} // 乘除法,高优先级 }; // 读取输入表达式,直到文件结束 while(scanf("%s",inputExpression)!=EOF){ // 定义处理过程中需要的变量 string Numstr; // 用于临时存储数字字符 stack<double> NumStack; // 数字栈 stack<char> OperatorStack; // 运算符栈 // 第二步:逐字符处理表达式 for(int i=0;;i++){ // 如果是数字,追加到数字字符串 if(inputExpression[i]>='0'&&inputExpression[i]<='9'){ Numstr.push_back(inputExpression[i]); } // 如果是运算符或结束符 else{ // 第三步:将数字字符串转换为实际数值并压入数字栈 if(!Numstr.empty()){ // 确保数字字符串不为空 double currentNum=stod(Numstr); Numstr=""; // 清空数字字符串,准备下一个数字 NumStack.push(currentNum); } // 第四步:根据运算符优先级进行计算 // 如果当前运算符优先级小于等于栈顶运算符,则先计算栈内的表达式 while(!OperatorStack.empty() && priority[inputExpression[i]]<=priority[OperatorStack.top()]){ // 取出栈顶的两个操作数和一个运算符 double rightoperand=NumStack.top(); NumStack.pop(); double leftoperand=NumStack.top(); NumStack.pop(); char currentoperator=OperatorStack.top(); OperatorStack.pop(); // 第五步:执行运算并将结果压回数字栈 double result=0; switch (currentoperator) { case '+':result=leftoperand+rightoperand;break; case '-':result=leftoperand-rightoperand;break; case '*':result=leftoperand*rightoperand;break; case '/':result=leftoperand/rightoperand;break; } NumStack.push(result); } // 第六步:处理表达式结束或压入新运算符 if(inputExpression[i]=='\0'){ // 表达式结束,输出最终结果(取整数部分) printf("%d\n",(int)NumStack.top()); break; } else{ // 压入当前运算符到运算符栈 OperatorStack.push(inputExpression[i]); } } } } return 0; }