题目二:堆栈的应用
内容:
利用堆栈实现求算式表达式,表达式只包括4钟算术运算。 要求:
完成实验内容要求,编写程序实现。用10组数据去测试,10组数据当中包括5组非法数据和5组合法数据。提交报告,报告分三部分内容:
1) 自己是怎么做的?遇到什么问题,怎样解决的?
2) 用了哪些数据,得到什么结果?程序结果是不是跟你想的一样?为什么
不一样?
3) 还有哪些值得改进或者不懂的? 解:
本次实验的部分代码主要参考了教材附带光盘里面的ALG00304部分,以实现更快的设计出可行的算法。基本的设计思想如下:
为了实现算符的优先次序,设计了两个工作栈,一个为OPTR,用以寄存运算符;而另外一个为OPND,用来寄存操作数或运算结果。
首先设置操作数栈OPND为空栈,表达式起始符“#”为运算符栈的栈底元素。 依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕,即OPTR栈的栈顶元素和当前读入的字符均为“#”,其中#是结束符。
另外在此次的算法设计中还调用了两个库里面的函数,一个是Precede,主要是用来判定运算符栈的栈顶运算符与读入的运算符之间的优先关系的函数,另一个是Operate,为进行二元运算的函数,如果是编译表达式,则产生这个运算的一组相应指令并返回存放结果的中间变量,如果是解释执行表达式,则直接进行该运算,并返回运算的结果。
步骤:先判断进栈符号的优先次序,如果是在合法符号之外的字符,定义为非法字符。int fuhao(char d)//判断c是否为七种运算符之一。接着设计算符表达式的优先算法,定义了两个栈OPTR和OPND,分别用来记录运算符和操作数,此外还用到了C语言中的一个函数atof将字符串转换成一个双精度数值并返回结
果,C语言中的atof函数的形参是指针类型。
主函数为: void main() {
SElemType result;
cout<<\请输入表达式,以#号结束\
//printf(\请输入表达式,以#号结束:\\n\result=EvaluateExpression();
//printf(\所求的表达式的结果为:\\n\
cout<<\所求表达式的结果为:\}
而对于符号优先次序的判断,则设计了以下程序: char Precede(char a1 ,char a2)//判定运算符的优先级。 { char r;
switch(a2) {
case'+': case'-':
if(a1=='('||a1=='#')
r='<';
else
r='>';
break;
case'*': case'/':
if(a1=='*'||a1=='/'||a1==')')
r='>';
else
r='<';
break;
case'(':
if(a1==')') { } else
r='<';
cout<<\括号匹配错误!\exit(OVERFLOW);
break;
case')':
if(a1=='(')
r='=';
else if(a1=='#') { } else
r='>';
cout<<\没有左括号\exit (OVERFLOW);
break;
case'#':
switch(a1) { case'#':
r='='; break;
case'(':
cout<<\没有右括号\
exit(OVERFLOW );
default:
r='>';
}//switch break;
}//switch return r;
}//Precede
如果输入的符号是在这7中之外的,我们定义为非法数据 int fuhao(char d)//判断c是否为七种运算符之一 { }
SElemType Operate( SElemType a, SElemType theta, SElemType b )//Operate为进行二元运算的a theta b的函数
switch(d) { case'+': case'-': case'*': case'/': case'(': case')': case'#':
return OK;
default:
return ERROR;
}//switch

