逆波兰表达式的求解问题
来源:互联网 发布:大数据 宣传片 脚本 编辑:程序博客网 时间: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); } 还是那句话有什么不太对的地方欢迎大家指正!
阅读全文
1 0
- 逆波兰表达式的求解问题
- 逆波兰表达式的求解
- 逆波兰表达式求解
- 求解逆波兰表达式
- C++的逆波兰表达式的求解
- 递归求解逆波兰表达式
- Java求解逆波兰表达式
- 逆波兰表达式(后缀表达式的求解)
- 求解逆波兰表达式(前缀表达式)
- 求解逆波兰表达式 除了括号都可用的
- 逆波兰表达式问题
- 四则运算(逆波兰表达式求解)
- 逆波兰式与表达式求解
- 逆波兰式与表达式求解
- 逆波兰表达式的计算问题
- 数据结构----顺序栈实现逆波兰表达式(后缀表达式)求解
- 波兰、逆波兰表达式
- 求解逆波兰表达式的值,回文数字的判断&&栈的应用
- 并行程序设计模式-future模式
- 行为经济学:面对风险,人类的想法其实很复杂
- BigDecimal 数据计算与精度舍入
- 启动页白屏换成图片后上滑
- kafka源码阅读环境搭建
- 逆波兰表达式的求解问题
- 前言
- 混合开发----论集成效率的提升空间
- vue复制功能
- Educational Codeforces Round 32【solved: 6 / 7】(F待补)
- mac回退iTunes版本记录
- 欢迎使用CSDN-markdown编辑器
- 删除二叉树所有叶节点
- 支付宝小程序map 的 controls不变化