一个例子,比如ab+cde+**,这是一个后缀表达式,那么如何转换为一棵表达式树呢?



先上代码,再解释:

object Main extends App{
import Tree.node
def isOperator(char: Char):Boolean="+-*/".contains(char)
val stack=new Stack[Tree]
val str="ab+cde+**"
str.foreach(ch=>{
isOperator(ch) match {
case true =>
val left=stack.pop()
val right=stack.pop()
stack.push(node(ch,left,right)) //操作符,弹出两个节点,作为新树的左右节点,把当前的操作符作为root,压栈
case false=>stack.push(node(ch))//非操作符,则新建节点,压栈
}
})
stack.pop().print
}

sealed trait Tree{self=>
def print={
def loop(tree:Tree,depth:Int):Unit=tree match {
case EmptyNode => EmptyNode
case Node(value,left,right) =>
loop(right,depth+1)
println(" "*depth+value)
loop(left,depth+1)
}
loop(self,1)
}
}
case class Node(value:Char,left:Tree,right:Tree)extends Tree
case object EmptyNode extends Tree{
override def toString: String = "N"
}
object Tree{
def node(value:Char,left:Tree=EmptyNode,right:Tree=EmptyNode):Tree=Node(value,left,right)
def empty:Tree=EmptyNode
}
class Stack[T](implicit classTag: ClassTag[T]){
val elements=new Array[T](100)
private var size=0
def isEmpty:Boolean=size==0
def push(x:T)={
elements(size)=x
size+=1
}
def pop():T={
if(isEmpty)
throw new Exception("empty stack")
size-=1
elements(size)
}
}

依次扫描字段串中的每个字符,如果是字母(非操作符),那么把这个字母作为树的节点(只是单节点)放入stack中;如果是操作符(isOperator),那么从stack中弹出两个节点作为新树的左右节点,依次进行到底.最后stack中只有一棵树,这棵树就是表达式树.

scala写算法-从后缀表达式构造的更多相关文章

  1. scala写算法-List、Stream、以及剑指Offer里部分题目基于scala解法

    Stream(immutable) Stream是惰性列表.实现细节涉及到lazy懒惰求值.传名参数等等技术(具体细节详见维基百科-求值策略). Stream和List是scala中严格求值和非严格求 ...

  2. scala写算法-快排

    快排算法很经典,今天用scala的函数式思维来整理一下并实现: def qsort(list: List[Int]):List[Int]=list match { case Nil=>Nil c ...

  3. scala写算法-用小根堆解决topK

    topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...

  4. C++实现计算器功能(包括计算含未知量的式子),输出后缀表达式

    大概描述        用c++语言在vc中实现部分数学计算功能.其中实现的数学计算功能包括加减乘除运算.开方计算.自然对数运算.以10为底的对数运算.幂计算.正弦余弦计算. 由用户输入要计算的表达式 ...

  5. 《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果

    /** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...

  6. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  7. leetcode算法学习----逆波兰表达式求值(后缀表达式)

    下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目:  有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...

  8. C语言- 基础数据结构和算法 - 09 栈的应用_中缀表达式转后缀表达式20220611

    09 栈的应用_中缀表达式转后缀表达式20220611 听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/ ...

  9. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...

随机推荐

  1. ecshop根据订单号查询物流信息

    目标:订单详情页可以根据订单查询当前物流信息. 效果图: 思路:点击后异步请求快递查询api,接受返回信息,拼接. 代码: admin下:order_info.htm //一:顶部插入jquery,在 ...

  2. JAVA基础1——字节&位运算

    占用字节数 & 取值范围 Java一共有8种基本数据类型(原始数据类型): 类型 存储要求 范围(包含) 默认值 包装类 int 4字节(32位) -2^31~ 2^31-1 0 Intege ...

  3. Java面向对象编程基础

    一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...

  4. RHCE之配置autofs远程挂载远程服务器的家目录

    [root@server0 ~]# yum -y install autofs              安装包 [root@server0 ~]# vim /etc/auto.master      ...

  5. POJ A Simple Problem with Integers 线段树 lazy-target 区间跟新

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 105742 ...

  6. Thinkphp高仿陌陌网页直播

    此项目利用 TP+Redis+Nginx+nginx-rtmp-module+ffmpeg+HLS +Swoole 的架构方案 GitHub 地址:https://github.com/DOUBLE- ...

  7. 高质量PHP代码的50个实用技巧必备(下)

    26. 避免直接写SQL, 抽象之 不厌其烦的写了太多如下的语句: ? 1 2 <span style="color:#333333;font-family:''Helvetica, ...

  8. Springmvc ModelAndView踩过的坑之HttpServletResponse response

    先抛出问题.以下两个方法声明有毛区别: @RequestMapping(value = "/rg") public void rg(@PathVariable Long pageI ...

  9. Selenium中如何使用xpath更快定位

    在学习Selenium路上,踩了也不少坑,这是我最近才发现的一个新写法,好吧,"才发现"又说明我做其他事了.对的,我现在还在加班! 开车~~~ 例子:知乎网 标签:Python3. ...

  10. html和css的区别

    html(结构) Hyper Text Markup Language(超文本标记语言)用于定义文档内容结构 1.该语言写的代码通常会被浏览器解析执行 2.超文本:不止包括文本,还有图片.链接.音乐. ...