算法流程:

主要分为四步:

1.当前字符为数字或者字母,则直接输出

2.当前字符为)。则在栈中匹配输出。一直匹配到),则停止输出(就是将)及其顶上的元素所有弹出来输出)

3.当前字符为操作符。则比較当前字符的入栈优先级(icp)和字符栈内优先级(isp)。假设icp<=isp,则将栈内操作符弹出输出,然后反复3

4.当前字符为空,则将栈中元素依次弹出输出

百度百科上面的描写叙述:

1、建立运算符栈stackOperator用于运算符的存储。压入'\0'。

        2、预处理表达式,正、负号前加0(假设一个加号(减号)出如今最前面或左括号后面,则该加号(减号)为正负号) 。

       3、顺序扫描表达式。假设当前字符是数字(优先级为0的符号),则直接输出该数字。假设当前字符为运算符或括号(优先级不为0的符号)。则推断第4点 。

       4、若当前运算符为'(',直接入栈;若为')',出栈并顺序输出运算符直到遇到第一个'('。遇到的第一个'('出栈但不输出;若为四则运算符,比較栈顶元素与当前元素的优先级:假设 栈顶元素运算符优先级 >= 当前元素的优先级,出栈并顺序输出运算符直到 栈顶元素优先级 < 当前元素优先级。然后当前元素入栈;假设 栈顶元素 < 当前元素,直接入栈。

       5、反复第3点直到表达式扫描完成。

       6、顺序出栈并输出运算符直到栈顶元素为'\0'。

当然我自己理解的就是依照自己实现的简单变化,没有包含大括号

我的代码:

	// 中序遍历改为兴许遍历
public String tranform(String obj)
{
Stack<Character> stack = new Stack<Character>();
String obj2 = "";
for (int i = 0; i < obj.length(); i++)
{
char ch = obj.charAt(i);
if (Character.isLetter(ch))// 字母或数字直接输出
{
obj2 += ch;
System.out.println(ch);
} else if (ch == ')')// 在栈中一致匹配到)操作符才停止出栈
{
char temp;
while ((temp = stack.pop()) != '(')
{
obj2 += temp;
System.out.println(temp);
}
} else
// 比較操作符的进栈优先级
{
if(stack.isEmpty())
{
stack.push(ch);
continue;
}
char temp = stack.peek();
while (icp(ch) <= isp(temp))//进栈优先级小于栈内优先级,则一直出栈
{
System.out.println(temp);
obj2+=temp;
stack.pop();
if(stack.isEmpty())break;
temp=stack.peek();
}
stack.push(ch);
}
}
//将栈中剩余的元素弹出来
while(!stack.isEmpty())
{
char temp=stack.pop();
obj2+=temp;
System.out.println(temp);
}
return obj2;
} // 操作符在栈内的优先级
private int isp(char ch)
{
switch (ch)
{
case '+':
case '-':
return 2;
case '*':
case '/':
return 4;
case ')':
return 7;
case '(':
return 1;
default:
break;
}
return 0;
} // 操作符进栈的优先级优先级
private static int icp(char ch)
{
switch (ch)
{
case '+':
case '-':
return 3;
case '*':
case '/':
return 5;
case ')':
return 1;
case '(':
return 7;
default:
break;
}
return 0;
} public static void main(String[] args)
{
String objString="a*(b+c)+c/d";
TreeNode<Character> treeNode=new TreeNode<Character>(null);
treeNode.tranform(objString); }

执行效果:

a*(b+c)+c/d   -》 abc+*cd/*
假设利用这个后序遍历非常easy实现一个简单的计算器,除此之外,我记得一个基于文法的计算器,等下一次实现。

数据结构之中序遍历转兴许遍历(JAVA实现)(二)的更多相关文章

  1. python、java实现二叉树,细说二叉树添加节点、深度优先(先序、中序、后续)遍历 、广度优先 遍历算法

    数据结构可以说是编程的内功心法,掌握好数据结构真的非常重要.目前基本上流行的数据结构都是c和c++版本的,我最近在学习python,尝试着用python实现了二叉树的基本操作.写下一篇博文,总结一下, ...

  2. 数据结构5_java---二叉树,树的建立,树的先序、中序、后序遍历(递归和非递归算法),层次遍历(广度优先遍历),深度优先遍历,树的深度(递归算法)

    1.二叉树的建立 首先,定义数组存储树的data,然后使用list集合将所有的二叉树结点都包含进去,最后给每个父亲结点赋予左右孩子. 需要注意的是:最后一个父亲结点需要单独处理 public stat ...

  3. 数据结构实验之求二叉树后序遍历和层次遍历(SDUT 2137)

    Problem Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历. Input 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据. ...

  4. 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)

    ​1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...

  5. JAVA二叉树递归构造、二叉树普通遍历及递归遍历

    二叉树类: package com.antis.tree; public class BinaryTree { int data; //根节点数据 BinaryTree left; //左子树 Bin ...

  6. LeetCode 145 Binary Tree Postorder Traversal(二叉树的兴许遍历)+(二叉树、迭代)

    翻译 给定一个二叉树.返回其兴许遍历的节点的值. 比如: 给定二叉树为 {1. #, 2, 3} 1 \ 2 / 3 返回 [3, 2, 1] 备注:用递归是微不足道的,你能够用迭代来完毕它吗? 原文 ...

  7. 树的深度优先遍历和广度优先遍历的原理和java实现代码

    import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode le ...

  8. Python入门篇-数据结构树(tree)的遍历

    Python入门篇-数据结构树(tree)的遍历 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.遍历 迭代所有元素一遍. 二.树的遍历 对树中所有元素不重复地访问一遍,也称作扫 ...

  9. PAT-1151(LCA in a Binary Tree)+最近公共祖先+二叉树的中序遍历和前序遍历

    LCA in a Binary Tree PAT-1151 本题的困难在于如何在中序遍历和前序遍历已知的情况下找出两个结点的最近公共祖先. 可以利用据中序遍历和前序遍历构建树的思路,判断两个结点在根节 ...

随机推荐

  1. JS求斐波那契数列的N项

    第一种求法: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF- ...

  2. 北大ACM(POJ1016-Numbers That Count)

    Question:http://poj.org/problem?id=1016 问题点:水题. Memory: 232K Time: 125MS Language: C++ Result: Accep ...

  3. 如何实现ADSL宽带用户开机自动拨号与定时拨号

    在宽带拨号网络的环境下,要通过手动拨号认证才能上网.下面给大家介绍怎么设置开机自动拨号上网以及定时拨号上网. 这也是为一个叫CHY的2B准备的技术套餐,不需要用到网上说的自动拨号软件,只要在主机上设置 ...

  4. CAD把自定义实体,变成普通实体(com接口VB语言)

    主要用到函数说明: MxDrawXCustomEvent::MxDrawXCustomEntity::explode 把自定义实体,变成普通实体,详细说明如下: 参数 说明 LONGLONG lEnt ...

  5. 使用SELECT语句检索数据

    使用SELECT语句检索数据select指令适用于SQL数据库SELECT 语句用于从数据库中选取数据.(指令不分大小写,选择的值除名字和一些有特殊意义的字符可不分大小写,from结束时一定要加;) ...

  6. HDU多校Round 5

    Solved:3 rank:71 E. Everything Has Changed #include <bits/stdc++.h> using namespace std; const ...

  7. idea之查看类的上下级继承关系

  8. python_ 学习笔记(运算符)

    python的运算符基本和C语言一致,以下说一些不一样的! 算术运算符 **:代表乘方,对应也有**=: //:代表商向下取整,对应也有//=: 逻辑运算符 and or not 位运算符 :& ...

  9. FileInputStream实现读取文件内容并输出到屏幕上

    java输入输出流是站在程序的角度来说的.从文件中读取数据用输入流,向文件中写数据用输出流. package com.janson.day20180827; import java.io.FileIn ...

  10. 网络配置:IP+NETMASK+GATEWAY+DNS

    1.  IP IP地址(英语:Internet Protocol Address)是一种在Internet上的给主机编址的方式,也称为网际协议地址.常见的IP地址,分为IPv4与IPv6两大类. IP ...