一.实验目的(Objects)
1.掌握栈的运算及应用;
2.了解算法的健壮性;
二.实验内容(Contents)
1.实现计算器类中 lp、rp和 operate函数;
2.完善计算器类 evaluate函数,增加对输入的合法性检查,包括滤掉所有非法输入及处理左 右括号不配对的输入;
3.编制应用程序测试这个计算器;
4.用如下表达式进行测试:
(56-23)/8-4# 期望结果:0.125
34+p(u89-12.3)k/3# 期望结果:59.5667
89.5*749+25)# 期望结果:输入有误
(8*(7-4)# 期望结果:输入有误
65*(72+98)(70-45)# 期望结果:输入有误
6*# 期望结果:输入有误
)5+3(# 期望结果:输入有误
5.验证计算结果。
三.实验步骤(Yourstepsorcodes)
1st.整体设计(Overalldesign)
本次实验整体设计是由两个类(class)作为主要框架。一个是 Stack类;一个是 Calculator类。其中, 对 Stack类使用了泛型(Generic)。 其整体设计如下:
/********************************************栈的构建*********************************************/
template<typenameT>
classStack{
//栈模板类的创建与其数据变量
private:
T* n;//栈中存储数据的数组;
Stac_Int Nlen;//栈当前长度;
Stac_Int capacity;//栈的最长长度;
Stac_Int top_;//存储当前栈顶元素的下标;
public:
Stack();//构造函数
~Stack();//析构函数
void push(Tx);//栈的 push函数,向栈顶添加元素
T top();//栈的 top函数,返回栈顶元素
bool isEmpty();//栈的为空判断
bool isFull();//栈的为满判断
Stac_Int backNlen();//返回栈的长度
void pop();//栈的 pop函数,弹出栈顶元素
void to_empty();//清空栈
};
//****************************************计算器类的构建*******************************************//
classCalculator{
private:
Stack<char> optr;//运算符栈;
Stack<double> opnd;//运算数栈;
char* at;//计算器类的运算式字符串的头指针;
int n;
int lp(chara);//返回字符栈头部字符的优先级命令;
int rp(chara);//返回录入读取字符的优先级命令;
double char_to_double(char*a,intn);
//该函数进行字符串的小数转换成 double类型的小数(但只对有一个点 的小数有作用)
double operate_double(chara,doublex1,doublex2);//该函数计算两数的四则运算
public:
Calculator();//无参构造函数;
Calculator(char*a,intnn);//含参构造函数;
~Calculator();//析构函数;
void operate();对输入的一串算术字符串式的处理(核心处理函数);
bool rr(chara)const;//辅助函数;
bool evaluate()const;//判断输入的一串算术字符串是否合法;
double result();//返回运算结果;
};
有关于 Stack类和 Calculator类的核心函数定义,我会在算法框架那一栏里详细说明。
2nd.算法框架(Algorithm Framework)
1. 关于 Stack类核心函数的算法框架:
核心函数为:
void push(T x);//栈的 push函数,向栈顶添加元素
T top();//栈的 top函数,返回栈顶元素
void pop();//栈的 pop函数,弹出栈顶元素
void to_empty();//清空栈
1>.关于 push函数:
//栈的 push函数,向栈顶添加元素
template<typename T>
void Stack<T>::push(T x)