stack 实现中缀表达式

实验3
题目  算术表达式的计算

【问题描述】
    利用堆栈实现算术表达式的计算
【实验内容】
  必做内容:运算对象均为整数
  选作内容:运算对象扩充为可以是带小数位的浮点数
【测试数据】
输入格式:一行一个算术表达式,可以输入若干行
输出格式:一行一个输出结果
样例:
输入样例:
2*(3 + 4)
6+ 2 * 8 /4
输出样例
14
10
代码:
#include<iostream>//中缀——>后缀——>计算(不包括括号)
#include<stack>
#include<string>
using namespace std;
void main()
{
  bool flag;//判断是否包括()
  char ex[20][20];
  int i=0,k;
  int m;
  cout<<"n=";
  cin>>m;
  cout<<"输入表达式:"<<endl;
  for(i=0;i<m;i++)
  {
   k=0;
   while(ex[i][k-1]!='=')
    {
     cin>>ex[i][k];
     k++;
    }
  }
  cout<<"输出表达式:"<<endl;
  int left,right,rel;//后缀算式的计算
     int n,num;
     int  f;
  stack<char> a;//利用栈来储存运算符号
  char last[20][20];//存放后缀表达式
  stack<int>b;
  for(int j=0;j<i;j++)
  {   
      k=0; 
   f=0;
   n=0;
   while(ex[j][k]!='=')
   {
    if(ex[j][k]=='(')
    {
        flag=true;
     break;
    }
    else
     flag=false;
    k++;
   }
   k=0;
      while(ex[j][k]!='='&&flag==true)//算式包括括号
   {
         if(ex[j][k]=='('||ex[j][k]=='+'||ex[j][k]=='-'||ex[j][k]=='*'||ex[j][k]=='/')
    a.push(ex[j][k]);
      else 
   if(ex[j][k]==')')
       while(!a.empty())
      if(a.top()=='(')
      a.pop();
      else
      {
      last[j][f]=a.top();
         a.pop();
      f++;
      }
      else 
   {
    last[j][f]=ex[j][k];
       f++;
   }
          k++;
   }
   if(flag==true)
   {
      while(!a.empty())
    {
      last[j][f]=a.top();
         a.pop();
      f++;
      }
   }
  while(ex[j][k]!='='&&flag==false)//算式不包括括号
   {
         if(ex[j][k]=='+'||ex[j][k]=='-'||ex[j][k]=='*'||ex[j][k]=='/')
    a.push(ex[j][k]);
      else 
   {
    last[j][f]=ex[j][k];
       f++;
   }
   if(ex[j][k+1]=='=')
       while(!a.empty())
      if(a.top()=='(')
      a.pop();
      else
      {
      last[j][f]=a.top();
         a.pop();
      f++;
      }
          k++;
   }
      last[j][f]='=';   
         while(last[j][n]!='=')
   {
              if(last[j][n]>=48&&last[j][n]<=57)
     {
                  num=(int)last[j][n]-48;   //数值转换成整型
               b.push(num);
     }
            else
      {
       right=b.top();
          b.pop();
             left=b.top();
          b.pop();
                switch(last[j][n])
       {
               case '+':rel=right+left;break;
               case '-':rel=left-right;break;
                case '*':rel=left*right;break;
               case '/':
       if(right==0)
             cout<<"right=0!"<<endl;
                else
             rel=left/right;
             break;
       }
                b.push(rel);
      }
               n++;
   }
            cout<<b.top()<<endl;
          b.pop();
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值