做易经类的网站,路由优化大师官网,开发商城网站,网站做cpa推广引流acwing3302
知识点一#xff1a;有关unordered_map的优先级
头文件unordered_map,然后进行符号优先级定义
定义方式unordered_mapchar,intpr{ {,1},{-,1},{*,2},{/,2}};其余没定义的默认为0
知识点二#xff1a;头文件cctype中的isdigit()是判断…acwing3302
知识点一有关unordered_map的优先级
头文件unordered_map,然后进行符号优先级定义
定义方式unordered_mapchar,intpr{ {,1},{-,1},{*,2},{/,2}};其余没定义的默认为0
知识点二头文件cctype中的isdigit()是判断是否是数字的函数是则返回true
#includeiostream
#includecstring
#includealgorithm
#includestack
#includeunordered_map
using namespace std;
stackintnum;
stackintop;
void eval(){auto bnum.top();num.pop();//第二个操作的数 auto anum.top();num.pop();//第一个操作的数 auto cop.top();op.pop();//运算符 int x;if(c)xab;else if(c-)xa-b;else if(c*)xa*b;else xa/b;num.push(x);//结果
}
int main(){unordered_mapchar,intpr{{,1},{-,1},{*,2},{/,2}};string str;cinstr;//读入表达式 for(int i0;istr.size();i){auto cstr[i];if(isdigit(c)){//数字入栈int x0,ji;//计算数字 while(jstr.size()isdigit(str[j])){//例子如果是12那x1然后就是1×10加数字2才得到数字12 xx*10str[j]-0;j;}ij-1;//使得i指向2i下一次就是数字12的下一个位置 num.push(x);//把12入栈 }else if(c()op.push(c);else if(c)){while(op.top()!()eval();//一直算到左括号 op.pop();//左括号出栈 }else{//待入栈运算符优先级低则先计算 while(op.size()pr[op.top()]pr[c])eval(); //先判空 op.push(c);//操作符入栈}}while(op.size())eval();//剩余结果进行计算coutnum.top()endl;//输出结果return 0;
}
//例子
//(12)*(23)
//先放入栈为op中【( num【12
//然后遇到)了开始执行eval弹出num使得b等于2a等于1不能颠倒op弹出
//然后进行123入栈变成num【3再弹出(op【 空了
//再op【*,(,,num【3,2,3最后遇到)执行eval弹出num的b等于3a等于2op弹出
//然后进行 235,入栈变成num【3,5然后进行剩余计算eval得出结果
//如果过程中有两个符号对碰比如【*再进行要入栈时就会先执行eval把先计算掉 例题洛谷P10473