stack 实现中缀表达式

来源:互联网 发布:w判断矩阵 编辑:程序博客网 时间:2024/06/06 14:08
实验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();  }}


原创粉丝点击