任务描述
本关任务:输入一个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为double类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。)
编程要求
输入
多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。参加运算的数为double类型。
输出
对于每组数据输出一行,为表达式的运算结果。输出保留两位小数。
测试说明
平台会对你编写的代码进行测试:
测试输入:
2+2=
20*(4.5-3)=
=
预期输出:
4.00
30.00
来源
https://www.bjfuacm.com/
C++代码
240 head.h文章来源:https://www.toymoban.com/news/detail-739723.html
#include <iostream>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef struct
{//符号栈
char* base;
char* top;
int stacksize;
}SqStack1;
int InitStack1(SqStack1& S)
{//符号栈初始化
S.base=new char[MAXSIZE];
if (!S.base) exit (OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
int Push1(SqStack1& S, char e)
{//符号栈入栈
if (S.top-S.base==MAXSIZE)
return ERROR;
*S.top++=e;//元素e入栈
return OK;
}
int Pop1(SqStack1& S)
{//符号栈出栈
char e;
if (S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}
char GetTop1(SqStack1 S)
{//符号栈取栈顶元素
char e;
if (S.top==S.base) return ERROR;
e=*(S.top-1);
return e;
}
typedef struct
{//数字栈
double* base;
double* top;
int stacksize;
}SqStack2;
int InitStack2(SqStack2& S)
{//数字栈初始化
S.base=new double[MAXSIZE];
if (!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
int Push2(SqStack2& S, double e)
{//数字栈入栈
if (S.top-S.base==MAXSIZE)//栈满
return ERROR;
*S.top++=e;//e入栈
return OK;
}
int Pop2(SqStack2& S)
{//数字栈出栈
double e;
if (S.top == S.base) return ERROR;
e = *--S.top;
return OK;
}
double GetTop2(SqStack2 S)
{//数字栈取栈顶元素
double e;
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return e;
}
double Calculate(double a, char op, double b)
{//算术表达式的求值 a在前,b在后
switch(op)
{
case '+':return a+b;
break;
case '-':return (a-b);
break;
case '*':return(a*b);
break;
case '/':return(a/b);
break;
}
}
char Precede(char theta1, char theta2)
{//比较符号优先级
if ((theta1 == '(' && theta2 == ')') || (theta1 == '=' && theta2 == '=')) {
return '=';
} else if (theta1 == '(' || theta1 == '=' || theta2 == '(' || (theta1
== '+' || theta1 == '-') && (theta2 == '*' || theta2 == '/')) {
return '<';
} else
return '>';
}
(主函数文件不可编辑)文章来源地址https://www.toymoban.com/news/detail-739723.html
#include "head.h"
int main()
{
char s[100];
while(cin>>s)
{
if(s[0]=='=') break;
SqStack1 op;
InitStack1(op);
SqStack2 data;
InitStack2(data);
Push1(op,'=');
//提前在符号栈中放入'=',便于以后比较符号优先级
int i,x=0,e=0,flag=0;
//x和e辅助存储double型数据
//flag用于判断某个double类型数据是否处理完,1表示未完成,0表示完成
for(i=0;s[i]!='\0';i++)
{
if('0'<=s[i]&&s[i]<='9')
{
flag=1;
x=x*10+(s[i]-'0');//x存储去掉小数点的数据,如原数据1.23,最终得到的x为123
if(e!=0) e=e*10;//小数点后有几位,e扩大为10的几倍
}
else if(s[i]=='.')
e=1;
else
{
if(flag!=0)
{
double number=x;
if(e!=0) number=number/e;
//如果其间有小数点出现,number缩小对应的倍数
Push2(data,number);//将double类型数据入栈
x=e=flag=0;//复原x、e、flag
}
while(1)
{
if(Precede(GetTop1(op),s[i])=='<')
{//符号栈栈顶元素优先级低于当前符号,将当前符号入栈
Push1(op,s[i]);
break;
}
else if(Precede(GetTop1(op),s[i])=='>')
{//符号栈栈顶元素优先级高于当前符号,出栈计算,所得结果重新入栈
double b=GetTop2(data);
Pop2(data);
double a=GetTop2(data);
Pop2(data);//将数字栈顶端的两个元素出栈
char oper=GetTop1(op);
Pop1(op);//将符号栈顶端的一个符号出栈
Push2(data,Calculate(a,oper,b));//将运算结果压入数字栈
}
else
{//其余情况时,将符号栈栈顶元素出栈
Pop1(op);
break;
}
}
}
}
printf("%.2f\n",GetTop2(data));
}
return 0;
}
到了这里,关于【 第1关:基于栈的中缀算术表达式求值】【编程题实训-栈】【头歌】【bjfu-240】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!