逆波兰表达式的求解问题

来源:互联网 发布:大数据 宣传片 脚本 编辑:程序博客网 时间:2024/05/20 23:06

因为要考研究生,第一次学习数据结构,算法中的一些关于栈的基本操作是从严蔚敏编著的《数据结构》(C语言版)学来,代码有一些不够完整或者欠缺的地方,希望有大神可以帮忙指出,感激不尽。
下面具体谈一谈逆波兰表达式。
逆波兰表达式也就是后缀式,它的主要特征是“S1 S2 OP”S1是第一操作数,S2是第二操作数,OP则是运算符了。
举个例子:正常的表达式是5*2,也就是”S1 OP S2”,这是符合我们学习的数学的,然而计算机对于这样的式子不是太方便计算,所以逆波兰表达式应运而生。
所以对于上面的例子逆波兰表达式就是52*。特点是操作数的顺序不变,运算符到最后那么计算机在运行的时候则是从左到右扫描表达式,一旦遇到了运算符,那么紧挨着它前面的操作数应该是第二操作数(S2),再往前面一个是第一操作数(S1),然后即可开始运算。运算结果又作为新的操作数。所以这里我用了一个栈来存储操作数,下面就是我的具体的算法思想了,有一些函数没有完全写出来,有些是不太清楚怎么写,具体都在代码里了。
关于栈的一些函数比如”pop”’,”push”等为了算法简略这里我就不具体说明了,具体大家可以参考上文提到的书里的47页。
还有一个函数”in(c,op)”判断c是否在运算符集合的这个函数,我也是一时没写出具体的代码,不过这也不妨碍阐述整个逆波兰思想吧,嘿嘿。
这里我处理的表达式已经是转换好的后缀表达式,不包含从原表达式转换成后缀式的代码,这块还不太清楚,欢迎高手指导。

int operate(int s1,char op,int s2){//为了简单起见这里假定运算符只有加减乘除四种    switch(op)    {    case'+': return(s1+s2);    case'-': return(s1-s2);    case'*': return(s1*s2);    case'/': return(s1/s2);    default: exit(-1);    }}int nibolan(){  Initstack(OPND);//首先初始化栈OPND存储操作数  c=getchar();//挨个字符获取表达式  while(c!='\n'||c!='#')//既不是换行符也不是结束符则继续循环  {    if(!In(c,op)){push(OPND,c);c=getchar;}//如果c不在运算符集合(op)中,压入操作数栈    else{         pop(OPND,S2);         pop(OPND,S1);//最先出栈的应该是第二操作数         r=operate(S1,OP,S2);         push(OPND,r);//操作数运算的结果也是操作数继续压入操作数栈         c=getchar();         }//else   }//while   Gettop(OPND,result);//循环结束最后操作数栈中的结果就是整个表达式的值   return(result);   }   还是那句话有什么不太对的地方欢迎大家指正!
原创粉丝点击