支持括号,浮点运算,需要输入一串 运算表达式 后面加一个#
#include<bits/stdc++.h> using namespace std; char pre[7][7]= { '>','>','<','<','<','>','>', '>','>','<','<','<','>','>', '>','>','>','>','<','>','>', '>','>','>','>','<','>','>', '<','<','<','<','<','=','<', '>','>','>','>','>','>','>', '<','<','<','<','<','<','=', }; stack<double>oprn; stack<char>optr; bool isOprn(char ch) { if(ch>='0'&&ch<='9'||ch=='.') return true; return false; } double compute(double a,double b,char c) { switch(c) { case '+': return a+b; break; case '-': return a-b; break; case '*': return a*b; break; case '/': return a/b; break; } } int getIndex(char c) { switch(c) { case '+': return 0; break; case '-': return 1; break; case '*': return 2; break; case '/': return 3; break; case '(': return 4; break; case ')': return 5; break; case '#': return 6; break; } } double calculate(string str) { while(!oprn.empty())oprn.pop(); while(!optr.empty())optr.pop(); optr.push('#'); int flag=0,lefti,righti,i=0,opli,opri;; double opnl,opnr; while(!optr.empty()) { if(flag==0&&(isOprn(str[i])||(i==0||str[i-1]=='(')&&str[i]=='-'&&isOprn(str[i+1]))) { lefti=i; flag=1; } else if(!isOprn(str[i])) { if(flag==1) { righti=i; stringstream num(str.substr(lefti,righti-lefti)); num>>opnl; oprn.push(opnl); flag=0; } opri=getIndex(str[i]); opli=getIndex(optr.top()); while(1) { if(pre[opli][opri]=='<') { optr.push(str[i]); break; } else if(pre[opli][opri]=='>') { char op=optr.top(); optr.pop(); opnr=oprn.top(); oprn.pop(); opnl=oprn.top(); oprn.pop(); oprn.push(compute(opnl,opnr,op)); opli=getIndex(optr.top()); } else if(pre[opli][opri]=='=') { optr.pop(); break; } } } i++; } double ans=oprn.top(); oprn.pop(); return ans; } int main() { int t; cin>>t; while(t--) { string str; cin>>str; cout<<setprecision(4)<<fixed<<calculate(str)<<endl; } return 0; }