例如:直接输入2+12*(5-1+(4/3))*2
#include<iostream>
#include<cstdlib>
#include<cctype>
//函数原型
int addsubt();
int multdiv();
int number();
void error();
//全局表达式缓冲器
static char expr[100];
static int pos;
/////////////////////////
//main函数
////////////////////////
int main()
{
int ans;
do
{
//初始化字符串下标
pos=0;
//读取表达式
std::cout<<"Enter expression (0 to quit):"<<endl:
std::cin>>expr;
//表达式求值
ans=addsubt();
if(expr[pos]!='\0')
error();
if(ans!=0)
std::cout<<ans<<endl;
}
while(ans!=0);
return 0;
}
///////////////////////
//逆序递归的顶层:加/减
///////////////////////
int addsubt()
{
int rtn = multdiv();
while(expr[pos]=='+'||expr[pos]=='-')
{
int op = expr[pos++];
int opr2=multdiv();
if(op=='+') rtn+=opr2;
else rtn-=opr2;
}
return rtn;
}
///////////////////////
//最高优先级:乘/除
///////////////////////
int multdiv()
{
int rtn = number();
while(expr[pos]=='*'||expr[pos]=='/')
{
int op = expr[pos++];
int opr2=number();
if(op=='*') rtn*=opr2;
else rtn/=opr2;
}
return rtn;
}
///////////////////////
//开括号
///////////////////////
int number()
{
int rtn;
if(expr[pos]=='(')
{
pos++;
rtn=addsubt(); //返回顶层
if(expr[pos]!=')') //必须有‘)’
error();
return rtn;
}
if(!isdigit(expr[pos]))
error();
rtn=atoi(expr+pos);
while(isdigit(expr[pos]))
pos++;
return rtn;
}
///////////////////////
//语法错误
///////////////////////
void error()
{
etd::cout<<'\r';
while(pos--)
std::cout<<' ';
std::cout<<"^syntax error"<< std::endl <<'\a';
exit(-1);
}