题解 | 四则运算
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
#include <cctype>
#include <iostream>
#include <stack>
using namespace std;
int pos;
int compute(string &s){
int num=0;
char flag='+';
stack<int>st;
while (pos<s.size()) {
if(s[pos]=='{'||s[pos]=='['||s[pos]=='('){
pos++;
num=compute(s);
}
//读取数字
while (pos<s.size()&&isdigit(s[pos])) {
num=num*10+s[pos]-'0';
pos++;
}
//队列计算
switch (flag) {
case '+':{
st.push(num);
break;
}
case '-':{
st.push(-num);
break;
}
case '*':{
int tmp=num*st.top();
st.pop();
st.push(tmp);
break;
}
case '/':{
int tmp=st.top()/num;
st.pop();
st.push(tmp);
break;
}
}
// 归零
num=0;
//结束内部循环
if(s[pos]=='}'||s[pos]==']'||s[pos]==')'){
pos++;
break;
}
//进行移动
flag=s[pos];
pos++;
}
int count=0;
while (!st.empty()) {
count+=st.top();st.pop();
}
return count;
}
int main() {
string s;cin>>s;
pos=0;
cout<<compute(s)<<endl;
}
// 64 位输出请用 printf("%lld")
#include <cctype>
#include <iostream>
#include<bits/stdc++.h>
#include <stack>
using namespace std;
int calculate(string &s){
stack<int>nums;
stack<char>ops;
auto compute=[&](){
if(nums.size()<2||ops.empty())return;
int a=nums.top();nums.pop();
int b=nums.top();nums.pop();
char c=ops.top();ops.pop();
switch(c){
case '+':nums.push(a+b);break;
case '-':nums.push(b-a);break;
case '*':nums.push(b*a);break;
case '/':nums.push(b/a);break;
}
};
unordered_map<char,int>pro{{'+',1},{'-',1},{'*',2},{'/',2}};
for(int i=0;i<s.size();i++){
char c=s[i];
if(isdigit(c)){
int num=0;
while (isdigit(s[i])) {
num=num*10+(s[i]-'0');
i++;
}
i--;
nums.push(num);
}
else if(c=='('||c=='{'||c=='['){
ops.push('(');
}
else if(c=='+'||c=='-'||c=='*'||c=='/'){
if(c=='-'&&(s[i-1]=='('||s[i-1]=='{'||s[i-1]=='['||i==0)){
nums.push(0);
}
while(!ops.empty()&&ops.top() != '('&&pro[c]<=pro[ops.top()]){
compute();
}
ops.push(c);
}
else if(c==')'||c=='}'||c==']'){
while(!ops.empty()&&ops.top()!='('){
compute();
}
if(!ops.empty())ops.pop();
}
}
while(!ops.empty())compute();
return nums.top();
}
int main() {
string s;
while (cin >> s) { // 注意 while 处理多个 case
cout<<calculate(s);
}
}
// 64 位输出请用 printf("%lld")
