博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中序表达式转后序表式式
阅读量:5079 次
发布时间:2019-06-12

本文共 882 字,大约阅读时间需要 2 分钟。

中序表达式转后序表式式:

将中序表达式所有括号补全,然后将所有运算符向右移出无匹配的第一个右括号,去掉括号即为后序表式式

举例:
原式:a+b*(c+d/e)
补全括号:(a+(b*(c+(d/e))))
操作符右移:(a(b(c(de)/)+)*)+
去掉括号:abcde/+*+

中序表达式转前序表式式:

将中序表达式所有括号补全,然后将所有运算符向左移出无匹配的第一个左括号,去掉括号即为前序表式式

举例:
原式:a+b*(c+d/e)
补全括号:(a+(b*(c+(d/e))))
操作符右移:+(a*(b+(c/(de))))
去掉括号:+a*b+c/de

算法:

利用运算符栈(OPTR)和数据栈(OPND)将中缀表达式转化为后缀表达式。

将结束标志字符’#’放入操作符栈(OPTR); 

从中缀表达式pre左端依次读取pre[i]:

  • 1.若pre[i]为操作数,压入数据栈(OPND);
  • 2.若pre[i]为左括号,压入操作符栈(OPTR);
  • 3.若pre[i]为右括号,则将操作符栈(OPTR)中的运算符依次出栈并压入数据栈(OPND),直到遇到左括号为止,但是该左括号出栈但不压入数据栈(OPND)
  • 4.若pre[i]为操作符
    (1)若操作符栈(OPTR)为空,将此操作符pre[i]压入数据栈(OPND); 
    (2)若pre[i]的优先级大于操作符栈(OPTR)顶的优先级,将此操作符pre[i]压入数据栈(OPND); 
    (3)若操作符栈(OPTR)不为空且pre[i]的优先级小于等于操作符栈(OPTR)顶的优先级,将操作符栈(OPTR)中的运算符依次出栈并压入数据栈(OPND),直到不满足条件,此操作符pre[i]压入数据栈(OPND)

直到遍历完整个中序表达式之后,操作符栈(OPTR)中仍然存在运算符,那么将这些运算符依次出栈加入到数据栈(OPND)中,直到栈为空。

按照上述步骤完成后,将操作符栈(OPTR)逆序即可得到逆波兰表达式。

转载于:https://www.cnblogs.com/wwjldm/p/7155094.html

你可能感兴趣的文章
React学习记录
查看>>
nginx常见内部参数,错误总结
查看>>
对象与类
查看>>
《奸的好人2》财色战场----笔记
查看>>
BZOJ 1834网络扩容题解
查看>>
bzoj1878
查看>>
【Vegas原创】Mysql绿色版安装方法
查看>>
IniHelper——INI操作辅助类
查看>>
Less:优雅的写CSS代码
查看>>
BZOJ 1007: [HNOI2008]水平可见直线
查看>>
并发编程 - 线程 - 1.互斥锁/2.GIL解释器锁/3.死锁与递归锁/4.信号量/5.Event事件/6.定时器...
查看>>
我的第一个博客
查看>>
html到计时特效(直接代码)
查看>>
内存溢出异常
查看>>
clone方法详解
查看>>
C#深入.NET平台的软件系统分层开发
查看>>
Kibana功能一览
查看>>
设计模式之结构型模式
查看>>
如何写出高效的SQL语句
查看>>
Centos7 更换为网易YUM源
查看>>