题解 | 简单计算器
#include <bits/stdc++.h> using namespace std; int priority(char c){ if(c=='#')return 0; else if(c=='$')return 1; else if(c=='+'||c=='-')return 2; else return 3; } double getNum(string s,int& index){ double num=0; while(isdigit(s[index])){ num*=10; num+=s[index++]-'0'; } return num; } double calculate(double x,double y,char op){ double ans=0; if(op=='+')ans=x+y; else if(op=='-')ans=x-y; else if(op=='*')ans=x*y; else if(op=='/')ans=x/y; return ans; } int main(){ string s; while(getline(cin,s)){ if(s=="0")break; int index=0; std::stack<char> op; stack<double> data; s+='$'; op.push('#'); while(index<s.size()){ if(s[index]==' ')index++; else if(isdigit(s[index]))data.push(getNum(s,index)); else { if(priority(s[index])>priority(op.top())){ op.push(s[index]);index++; }else{ double y=data.top(); data.pop(); double x=data.top(); data.pop(); data.push(calculate(x,y,op.top())); op.pop(); } } } printf("%.2f\n",data.top()); } }
核心难度有三点,首先是数据的获取,我们要得到数据,需要扫描所有连续的数值,然后组合成一个真实的数,然后第二个难度就是如何完成扫描,我们要想要得到结果,需要根据字符串的顺序获取数值和符号,数值有多位,因此采用获取的同时给数字的情况,然后是符号,符号就是一位,直接获取即可,然后是空格,空格直接过就可以了,关于符号,这里就是我们的核心内容,获取符号的时候一定获取到了数值,这时候,我们只需要根据压栈计算规则运算即可,这是第三点,压栈计算怎么做,只要给不同等级的符号进行标记等级,比内部高则压入,比内部低则优先计算内部一个符号,就可以完成目标了。