{ case '+': return '<'; break; case '-': return '<'; break; case '*': return '<'; break; case '/': return '<'; break; case '(': return '<'; break; case '#': return '='; break; } break; }//switch(a) } Operating.cpp: #include \void Evaluateexpression_r() { //求值函数 char c,d[100]; int a,b,x,theta,i,data; Stack OPTR, OPND; InitStack(OPTR); Push(OPTR, '#'); InitStack(OPND); c=getchar(); while(c!='#'||GetTop(OPTR)!='#') { if (!In(c)) //不是运算符时执行 { i=0; do{ d[i++]=c; c=getchar(); } while(c>='0'&&c<='9'); //可存入一个或多个数字字符 d[i]='\\0'; //将输入的连续多个数字字符拼成了字符串 data=atoi(d); //将数字字符数组转换为数值 Push(OPND, data); //不是运算符则进栈OPND,负数可用(0-其绝对值)表示,如-10:(0-10) } else switch(Precede(GetTop(OPTR), c)) { case '<': Push(OPTR, c);c=getchar(); break;
case '=': Pop(OPTR, x);c=getchar(); break; case '>': Pop(OPTR, theta);Pop(OPND, b);Pop(OPND, a); Push(OPND, Operate(a, theta, b)); break; }//switch }//while printf(\表达式结果为: %d\\n\,GetTop(OPND));//输出运算结果 } void main() { printf(\请输入表达式(以#号结束):\\n\); while(1) //可执行多次运算 { Evaluateexpression_r(); printf(\请输入表达式(以#号结束):\\n\); } } #include \void Evaluateexpression_r() { //求值函数 char c,d[100]; int a,b,x,theta,i,data; Stack OPTR, OPND; InitStack(OPTR); Push(OPTR, '#'); InitStack(OPND); c=getchar(); while(c!='#'||GetTop(OPTR)!='#') { if (!In(c)) //不是运算符时执行 { i=0; do{ d[i++]=c; c=getchar(); } while(c>='0'&&c<='9'); //可存入一个或多个数字字符 d[i]='\\0'; //将输入的连续多个数字字符拼成了字符串 data=atoi(d); //将数字字符数组转换为数值 Push(OPND, data); //不是运算符则进栈OPND,负数可用(0-其绝对值)表示,如-10:(0-10) } else switch(Precede(GetTop(OPTR), c))
{ case '<': Push(OPTR, c);c=getchar(); break; case '=': Pop(OPTR, x);c=getchar(); break; case '>': Pop(OPTR, theta);Pop(OPND, b);Pop(OPND, a); Push(OPND, Operate(a, theta, b)); break; }//switch }//while printf(\表达式结果为: %d\\n\,GetTop(OPND));//输出运算结果 } void main() { printf(\请输入表达式(以#号结束):\\n\); while(1) //可执行多次运算 { Evaluateexpression_r(); printf(\请输入表达式(以#号结束):\\n\); } } 四、实验结果:
五、实验分析: 1、算符优先法是教材上有关栈的应用的一个具体实例,考虑到算符优先法中对于运算符的操作是先入先出的,正好符合栈这种结构的存储使用规则,于是我们便可以利用栈来实现算法 2、由于教材上给出的存储结构定义、函数等都是伪码,不是可执行的程序 代码,故需要从程序语言(C语言)角度考虑,将伪码转换成程序代码。而这是不是一个简单的工作。编写程序的过程需要非常的小心仔细,任何一个细小的错误,都会导致程序的运行失败。在写好程序第一次编译时,我的程序出现了将近80条错误,经过两天的检查、调试以及和同学的讨论,我的程序才最终通过编译,成功运行。 3、经过自己动手编写这个有关栈的程序,我发现自己对栈的理解更加完全、 更加深刻了。对于栈的逻辑结构、存储结构、操作函数、应用以及具体实现,我有一种豁然开朗的感觉。 4、此算法只能进行个位数的加减乘除运算,对两位及以上数不能操作,。 因此算符优先法对算术表达式求值存在很大的局限性。若要完善算术表达式求值,应该完善算法,或者换用其它算法来实现。