构造计算器

 
/*参考中缀式转换成后缀式的运算过程
运算过程:设立一个栈1,存放数字
设立一个栈2,存放运算符,首先栈为空,编译程序从左到右扫描中缀表达式,
若遇到操作数,合成数字,压栈1
若遇到运算符,则必须与栈2顶比较,运算符级别比栈顶级别高则进栈,否则退出栈2顶元素并运算
若遇到左括号,进栈2;若遇到右括号,则一直退栈2运算,直到退到左括号止当栈2变成空时,输出栈1顶数据
测试用例(4+3)*(2+3)失败,继续尝试*/
#include<iostream.h>
#include<stdio.h>
void main()
{
       char str[128];
       int stack1[128]={0};//数字栈
       char stack2[128];//运算符栈
       stack2[0]='1';
       char *p;
       p=str;
       int*q1;
       char *q2;
       q1=stack1;
       q2=stack2;
       int sum1,sum2;
       cout<<"请输入待处理的中缀运算式!"<<endl;
       cout<<"输入的中缀运算式符合以下要求: "<<endl;
       cout<<"(1) 中缀运算式在逻辑上和结构上无错。"<<endl;
       cout<<"(2) 中缀运算式长度不确定但不超过128个。"<<endl; 
       cout<<"(3) 中缀运算式仅出现在一行输入行中。"<<endl;
       cout<<"(4)中缀运算式中只包含4种2目运算符:+,-,*,/及两种优先级运算符(和)。"<<endl;
       cout<<"(5) 中缀运算式中的运算数由{0,1,…,8,9}中的一或者不超过四个数字(暂时不可以包含小数点)。"<<endl;
       cout<<"(6) 中缀运算式中不包含多余的空格。"<<endl;
       p=gets(str);//从键盘输入该表达式
       while(*p!='/0')
       {
              if(*p>='0'&&*p<='9')//字符到数字的转换
              {
                     if((*(p-1)=='+')||(*(p-1)=='-')||(*(p-1)=='*')||(*(p-1)=='/'))//如果前一个字符是运算符
                     {
                            q1++;
                            *q1=0;
                     }
                     int sum;
                     switch(*p)
                     {
                     case'0':sum=0;break;
                     case'1':sum=1;break;
                     case'2':sum=2;break;
                     case'3':sum=3;break;
                     case'4':sum=4;break;
                     case'5':sum=5;break;
                     case'6':sum=6;break;
                     case'7':sum=7;break;
                     case'8':sum=8;break;
                     case'9':sum=9;break;
                     }
                     *q1=*q1*10+sum;
              }
              else
              {
                     if(*p=='('||*p==')')//左括号或者右括号
                     {
                            if(*p=='(')//左括号,进栈
                            {
                                   q2++;
                                   *q2=*p;
                            }
                            else//右括号,出栈到左括号
                            {
                                   while(*q2!='(')
                                   {
                                          sum1=*q1;
                                          q1--;
                                          sum2=*q1;
                                          switch(*q2)
                                          {
                                          case'+':*q1=sum2+sum1;break;
                                          case'-':*q1=sum2-sum1;break;
                                          case'*':*q1=sum2*sum1;break;
                                          case'/':*q1=sum2/sum1;break;
                                          }
                                          q2--;
                                   }
                                          q2--;
                            }
 
                     }
                     else
                     {
                  if(((*p=='*'||*p=='/')&&(*q2=='+'||*q2=='-'))||*q2=='1'||*q2=='(')//优先级比栈顶高
                            {
                                   q2++;
                                   *q2=*p;
                            }
                            else
                            {
                                   sum1=*q1;
                                   q1--;
                                   sum2=*q1;
                                   switch(*q2)
                                   {
                                   case'+':*q1=sum2+sum1;break;
                                   case'-':*q1=sum2-sum1;break;
                                   case'*':*q1=sum2*sum1;break;
                                   case'/':*q1=sum2/sum1;break;
                                   }
                                   q2--;
                                   p--;
                            }
                     }
              }
              p++;
       }
       while(*q2!='1')//栈中元素全部出栈
       {
              sum1=*q1;
              q1--;
              sum2=*q1;
              switch(*q2)
              {
              case'+':*q1=sum2+sum1;break;
              case'-':*q1=sum2-sum1;break;
              case'*':*q1=sum2*sum1;break;
              case'/':*q1=sum2/sum1;break;
              }
              q2--;
       }
       cout<<*q1<<endl;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值