该死的表达式求值
晚上七点到八点花了不到一个小时写出来的表达式求值程序,因为几个无语的错误,居然调试到现在,累计调试的时间大概有五个小时了吧,太打击自信了!
教训:写代码细心,实时检验,以免程序长了之后花数倍的时间调试
#include<stack>
//#include<string>
#include<iostream>
using namespace std;
short Com[7][7]={ {1,1,0,0,0,1,1},{1,1,0,0,0,1,1},//运算符优先级
{1,1,1,1,0,1,1},{1,1,1,1,0,1,1},
{0,0,0,0,0,2,1},{1,1,1,1,1,1,1},{0,0,0,0,0,0,0}};
int Operate(int a,char theta,int b)//计算
{
if(theta=='+')return a+b;
if(theta=='-')return a-b;
if(theta=='*')return a*b;
if(theta=='/')return a/b;
}
int StoN(char z)//返回操作符代号便于计算优先级
{ if(z=='+')return 0;
if(z=='-')return 1;
if(z=='*')return 2;
if(z=='/')return 3;
if(z=='(')return 4;
if(z==')')return 5;
if(z=='#')return 6;
}
int count(char s[])//主程序
{
stack<char> oper;
stack<int> num;
int aa,bb,cc,t,ccc;
oper.push('#');
int l=strlen(s),i,j;
char temp[]="#";
strcat(s,temp);
//s[l+1]=35;
char c,theta;
i=-1;
c=s[++i];
while(c!='#' || oper.top()!='#')//oper.top()!='#'
{
//if(!(c=='+' || c=='-' || c=='*' || c=='/' || c=='(' || c==')'))
if(c>='0' && c<='9')
{
t=0;
while(c>='0'&&c<='9')
{
t++;
c=s[++i];
}
int d=atoi(s+i-t);
i--;
num.push(d);
c=s[++i];
}
else
{
cc=StoN(oper.top());
ccc=StoN(c);
//oper.pop;
switch(Com[cc][ccc])
{
case 0:// <
oper.push(c);
c=s[++i];
break;
case 2:// =
oper.pop();
c=s[++i];
break;
case 1:// >
theta=oper.top();
oper.pop();
bb=num.top();
num.pop();
aa=num.top();
num.pop();
num.push(Operate(aa,theta,bb));
break;
}
}
}
return num.top();
}
int main()
{
int n,base;
char s[100];
while(1){
cout<<"输入表达式";
cin>>s;
cout<<"key="<<count(s)<<endl;
}
printf("\n");
system("pause");
}
//4+2*3-10/5 ac
//2+(3+4/2)*2 ac
//2*(3+4/2)*2 ac
//2*2+(3+4) ac
//1+(2+3) ac
ps:百度不支持tab,晕。。。