【 第1关:基于栈的中缀算术表达式求值】【编程题实训-栈】【头歌】【bjfu-240】

任务描述

本关任务:输入一个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为double类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。)

编程要求

输入
多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。参加运算的数为double类型。

输出
对于每组数据输出一行,为表达式的运算结果。输出保留两位小数。

测试说明
平台会对你编写的代码进行测试:

测试输入:

2+2=
20*(4.5-3)=
=

预期输出:

4.00
30.00

来源
https://www.bjfuacm.com/

C++代码

240 head.h

#include 
#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 '>';
}

(主函数文件不可编辑)

#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;
}

你可能感兴趣的:(汤米尼克的数据结构:头歌外挂,c++,算法,数据结构)