当前位置: 代码迷 >> 综合 >> 加减乘除--计蒜客(蓝桥杯)
  详细解决方案

加减乘除--计蒜客(蓝桥杯)

热度:64   发布时间:2023-12-28 05:24:58.0

题目在这里

注意两点:

1、为了方便计算,我把输入的表达式最前面加左括号,最后面加右括号

2、次方运算设置为优先级最低。(因为这样做会让下一个运算符的优先级一定≥次方运算符)这样就能正确输出结果。

代码如下:

#include <iostream>
#include <stdlib.h>
#include <stack>
#include <map>
#include <math.h>
#define ll long long
using namespace std;
stack <ll> num;
stack <char> ch;
int yunsuan()
{ll x2=num.top();            //注意x1与x2的顺序num.pop();ll x1=num.top();num.pop();char c=ch.top();ch.pop();switch(c){case '+':return x1+x2;break;case '-':return x1-x2;break;case '*':return x1*x2;break;case '/':return x1/x2;break;case '^':return x1 = pow(x1,x2);break;}return 0;
}
bool cmp(char top,char a)
{if((top=='('))return false;if(a=='^')return false;if((top=='+'||top=='-') && (a=='*'||a=='/'))return false;if((a=='+'||a=='-'))return true;return true;
}
int main()
{string s;cin>>s;s = s+")";ch.push('(');int len = s.length();for(int i=0; i<len; i++){if(s[i]>='0' && s[i]<='9'){ll a=s[i]-'0';for(i=i+1; i<len; i++){if(s[i]>='0' && s[i]<='9'){a=a*10+(s[i]-'0');}else{i--;break;}}num.push(a);}else         //是符号的时候{while(cmp(ch.top(),s[i])){ll a = yunsuan();num.push(a);}ch.push(s[i]);}}cout<<num.top();return 0;
}

如果有更好的解法或者想讨论的地方欢迎留言!