实验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();
}
}