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

#include #include #include 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 '': //从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]={ '>','>','','','','>', '>','>','','','','>', '>','>','>','>','','','','>', '>','>','>','>','','','','>', '','>','>','>','\2','>','>','>','>','>','>', '','>','>','>','\2','\3','=','>','>','>','>', '','>','>','>','\2','\3','\2','\3','\2','>','>', '=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 ( lc(result, a)) printf("%lg\n", result); return 0; }。

全部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值