用栈实现复杂四则运算的C语言代码

 我来答
friday_collin
2008-12-02 · TA获得超过415个赞
知道小有建树答主
回答量:466
采纳率:100%
帮助的人:336万
展开全部
#include <cstdio>
#include <cstdlib>
#include <cstring>
class CalcInfixExp
{
public:
CalcInfixExp();
char calc(double &result, const char *s);
void error(char n);
char GetOrder(char a, char b);
bool NumPush(const char &a);
bool NumPop(char &a);
bool OpePush(const char &a);
bool OpePop(char &a);
private:
int p, q;
char ope[100];
char num[100];
};

CalcInfixExp::CalcInfixExp()
{
p=q=0;
};

bool CalcInfixExp::NumPush(const char &a)
{
if (q>=100) return false;
num[q++]=a;
return true;
}

char CalcInfixExp::calc(double &result, const char *s)
{
bool PopRight;
char f, szA[20], order;
int i;
double a, b, c;
p=q=0; //清空ope栈和num栈
OpePush('\0');
if (*s=='+') s++;
else if (*s=='-')
{
s++;
OpePush('-');
NumPush('0');
NumPush(',');
}
do
{
if (*s>='0' && *s<='9' || *s=='.')
{
do NumPush(*s++);
while (*s>='0' && *s<='9' || *s=='.');
NumPush(',');
}
else
{
OpePop(f);
switch (order=GetOrder(f, *s))
{
case '<':
OpePush(f);
OpePush(*s++);
if (*s=='+') s++;
else if (*s=='-')
{
s++;
OpePush('-');
NumPush('0');
NumPush(',');
}
break;
case '>':
//从num栈中获取第一个操作数
i=0;
if (q==0)
{
error('\4'); //num栈已空
return false;
}
NumPop(szA[i]);
do NumPop(szA[i]);
while (szA[i++]!=',');
szA[--i]='\0';
strrev(szA);
b=atof(szA);
//从num栈中获取第二个操作数
i=0;
if (q==0)
{
error('\4'); //num栈已空
return false;
}
do PopRight=NumPop(szA[i]);
while (szA[i++]!=',' && PopRight);
if (PopRight) NumPush(',');
szA[--i]='\0';
strrev(szA);
a=atof(szA);

//计算
switch (f)
{
case '+': c=a+b; break;
case '-': c=a-b; break;
case '*': c=a*b; break;
case '/': c=a/b; break;
}
gcvt(c, 16, szA);
i=strlen(szA)-1;
if (szA[i]=='.') szA[i]='\0';

//把计算结果压入栈
i=0;
do NumPush(szA[i]);
while (szA[++i]!='\0');
NumPush(',');
break;
case '=':
s++;
break;
default:
error(order);
return false;
}
}
}while (p!=0);
result=atof(num);
return true;
}

void CalcInfixExp::error(char n)
{
switch (n)
{
case '\1': printf("括号不匹配\n"); break;
case '\2': printf("右括号与左括号间没有运算符\n"); break;
case '\3': printf("低级括号内包含高级括号\n"); break;
case '\4': printf("运算符过多\n");
}
}
char CalcInfixExp::GetOrder(char a, char b)
{
static char order[11][11]={
'>','>','<','<','<','>','<','>','<','>','>',
'>','>','<','<','<','>','<','>','<','>','>',
'>','>','>','>','<','>','<','>','<','>','>',
'>','>','>','>','<','>','<','>','<','>','>',
'<','<','<','<','<','=','\3','\1','\3','\1','\1',
'>','>','>','>','\2','>','>','>','>','>','>',
'<','<','<','<','<','\1','<','=','\3','\1','\1',
'>','>','>','>','\2','\3','=','>','>','>','>',
'<','<','<','<','<','\1','<','\1','<','=','\1',
'>','>','>','>','\2','\3','\2','\3','\2','>','>',
'<','<','<','<','<','\1','<','\1','<','\1','='
};
int i[2], j=0, TreatB=0;
do
{
switch (a)
{
case '+': i[j]=0; break;
case '-': i[j]=1; break;
case '*': i[j]=2; break;
case '/': i[j]=3; break;
case '(': i[j]=4; break;
case ')': i[j]=5; break;
case '[': i[j]=6; break;
case ']': i[j]=7; break;
case '{': i[j]=8; break;
case '}': i[j]=9; break;
case '\0': i[j]=10; break;
default: return '\0';
}
j++;
a=b;
}while (TreatB^=1);
return order[i[0]][i[1]];
}

bool CalcInfixExp::NumPop(char &a)
{
if (q==0) return false;
a=num[--q];
return true;
}

bool CalcInfixExp::OpePush(const char &a)
{
if (p>=100) return false;
ope[p++]=a;
return true;
}

bool CalcInfixExp::OpePop(char &a)
{
if (p==0) return false;
a=ope[--p];
return true;
}

int main()
{
CalcInfixExp s;
double result;
char a[100];
while (gets(a))
if (s.calc(result, a))
printf("%lg\n", result);
return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式