用c++在原本只要求的加减基础上写了一个简易的表达式计算器,加入了中小括号,小数,还有立方。 新手上路,有许多不足之处,望体谅。下面直接上代码吧!
#include<iostream>
#include<string.h>
#include<math.h>
#include<stack>
using namespace std;
char c[1001];
int i=0;//当前锁定坐标
int len;//表达式长度
double num(int &i){
double sum=0;
bool isdot=false;
double temp=0.1;
while(c[i]>='0' && c[i]<='9'){
if(!isdot){
sum=sum*10+c[i]-'0';
}
else{
sum=sum+(c[i]-'0')*temp;
temp/=10;
}
i++;
if(c[i]=='.'){
i++;
isdot=true;
}
}
return sum;
}
double cal(double a,double b,char sign){
if(sign=='^'){
return pow(b,a);
}
if(sign=='+'){
return a+b;
}
if(sign=='-'){
return b-a;
}
if(sign=='/'){
if(a==0){
cout<<"ERROR";
exit(0);
}
return b/a;
}
return a*b;
}
void check(char a){
if(a=='+' || a=='-' || a=='*' || a=='/' || a=='^'){
cout<<"ERROR";
exit(0);
}
}
int main(){
cin>>c;
len=strlen(c);
stack<char>signal;
stack<double>number;
while(i<len){
if(c[i]!='1'&&c[i]!='2'&&c[i]!='3'&&c[i]!='4'&&c[i]!='5'&&c[i]!='6'&&c[i]!='7'&&c[i]!='8'&&c[i]!='9'&&c[i]!='0'&&c[i]!='-'&&c[i]!='+'&&c[i]!='/'&&c[i]!='*'&&c[i]!='^'&&c[i]!='('&&c[i]!=')'&&c[i]!='['&&c[i]!=']'){
cout<<"ERROR";
exit(0);
}
if(c[i]>='0' && c[i]<='9'){
number.push(num(i));
continue;
}
if(c[i]=='+' || c[i]=='-'){
check(c[i+1]);
while(!signal.empty() && signal.top()!='(' && signal.top()!='['){
char temp=signal.top();
signal.pop();
double a,b;
a=number.top();
number.pop();
if(number.empty()){
b=0;
}
else{
b=number.top();
number.pop();
}
number.push(cal(a,b,temp));
}
signal.push(c[i]);
i++;
continue;
}
if(c[i]=='*' || c[i]=='/'){
check(c[i+1]);
while(!signal.empty() && signal.top()!='('&&signal.top()!='[' && signal.top()!='+' && signal.top()!='-'){
char temp=signal.top();
signal.pop();
double a,b;
a=number.top();
number.pop();
b=number.top();
number.pop();
number.push(cal(a,b,temp));
}
signal.push(c[i]);
i++;
continue;
}
if(c[i]=='^'){
check(c[i+1]);
while(!signal.empty() && signal.top()!='(' &&signal.top()!='['&& signal.top()!='+' && signal.top()!='-' && signal.top()!='*' && signal.top()!='/'){
char temp=signal.top();
signal.pop();
double a,b;
a=number.top();
number.pop();
b=number.top();
number.pop();
number.push(cal(a,b,temp));
}
signal.push(c[i]);
i++;
continue;
}
if(c[i]=='['){
signal.push(c[i]);
i++;
continue;
}
if(c[i]=='('){
signal.push(c[i]);
i++;
continue;
}
if(c[i]==']'){
while(signal.top()!='['){
if(signal.empty()){
cout<<"ERROR";
exit(0);
}
char temp=signal.top();
signal.pop();
double a,b;
a=number.top();
number.pop();
b=number.top();
number.pop();
number.push(cal(a,b,temp));
}
signal.pop();
i++;
continue;
}
if(c[i]==')'){
while(signal.top()!='('){
if(signal.empty()){
cout<<"ERROR";
exit(0);
}
char temp=signal.top();
signal.pop();
double a,b;
a=number.top();
number.pop();
b=number.top();
number.pop();
number.push(cal(a,b,temp));
}
signal.pop();
i++;
continue;
}
}
while(!signal.empty() && signal.top()!='(' && signal.top()!='['){
char temp=signal.top();
signal.pop();
double a,b;
a=number.top();
number.pop();
b=number.top();
number.pop();
number.push(cal(a,b,temp));
}
cout<<number.top()<<endl;
return 0;
}
输入输出样例(不需要加等号):