本文实例讲述了Java中缀表达式转后缀表达式实现方法。分享给大家供大家参考,具体如下:
本文先给出思路与方法,最后将给出完整代码
项目实战:
https://www.jb51.net/article/158335.htm
算法综述:
一、中缀表达式转后缀表达式:
1.中缀表达式要转后缀表达式,首先需要两个Stack(栈),其中一个应用于存放字符,另一个用于存放数字。
2.读到数字直接存入数字栈中,读到字符时,要咸鱼栈内前一元素(字符)进行比较,当当前(要存入的字符)优先级大于迁移字符时才存入,否则(>=)要仿佛将栈内元素弹出,并依次存入数字栈中。
提示:‘(' 的优先级默认比所有字符都小。所有字符都可以存在它后面;同时夜笔所有字符都大,可以存在所有字符后面
3.遇到 ‘)'时将栈内所有字符依次弹出,并存入数字栈中,知道遇到 ‘(' 为止
4.当所有字符、数字访问完毕时,栈内很可能还会有剩余的字符,这是将他们一次弹出,并纯如数字栈中
小技巧:
1.存放‘+',‘-'时,如果只有当前一个数位空或者‘(' 时才进行存入操作,否则均弹出。
2.存放 ‘*',‘/' 时,只有当前一个数位 ‘*',‘/' 时才弹出其他情况下,均存入。
附上代码:
/* * 中缀转后缀 */ public void toPostfix() { // TODO Auto-generated method stub int sum = 0 ;//用于记入”()“总个数 int j = 0 ;//用于读到”)“时循环出栈 String outStack = null; charnum.push(null); for( int i = 0 ; izanshi = new Stack<>(); for(int i = 0 ; i
二、后缀表达式计算
后缀表达式计算只遵循一个原则:
首先将表达式存在栈中
遇到符号时弹出两个相应的数字,进行计算后再次 存入栈内
最后栈内身下的唯一一个数,就是所要求的结果
/* * 后缀表达式求值 */ public String postfix() { int a = 0 , b = 0;//栈中弹出的两数 int sum ;//求两数运算 for (int i = 0; i
最后附上完整代码
//注:代码中有很多输出 方便读者实时查看运算过程中 各内容 // 这些输出导致篇幅较长 大家看明白后 删去即可 public class Calculate { private Stacknum; //后缀用栈 中转后数字栈 private Stack charnum;//中转后字符栈 private String []calculate;//存字符串数组 private int calculateLength;//字符串数组长度 public Calculate() { // TODO Auto-generated constructor stub num = new Stack<>(); //后缀用栈 中转后数字栈 charnum = new Stack<>();//中转后字符栈 calculate = new String[1000];//存字符串数组 calculateLength = 0 ;//字符串数组长度 } //转字符串数组 public void toStringArray(String input) { boolean pointFalg = false; char charArray[] = input.toCharArray(); double number = 0;//用于导入多位数 int j = 0 ;//用于计入当前字符串数组的位数 int sizeOfArray = charArray.length; int pointBelow =1 ; for(int i = 0 ; i '9' ) && charArray[i+1] != '.'){ if ( (i + 1) != sizeOfArray && charArray[i+1] == ' ') { i++; } calculate[j++] = String.valueOf(number); System.out.println("number:" + number); number = 0 ; pointFalg = false; } } System.out.println("---z->" + calculate[i]); } calculateLength = j-- ;//不--会将‘#'存入 } public void outPutCalculate() { for(int i = 0 ; i zanshi = new Stack<>(); // num.pop(); for(int i = 0 ; i
结果如下:
一、前缀转后缀并输出
其中over前为转化后的后缀表达式
over后为计算结果
public class Main { public static void main(String[] args) { Calculate text = new Calculate(); text.toStringArray("1+2*(3-1+2)-3"); text.outPutCalculate(); text.toPostfix(); System.out.println(text.postfix()); } }
二、后缀直接输出
注意后缀表达式时
为了实现多位数运算,连续输入一串数时 ,输入完一个数加空格
如:要计算:"1+2*(3-1+2)-3" 则输入:"1 2 3 1-2+*+3-"
例:
public class Main { public static void main(String[] args) { Calculate text = new Calculate(); text.toStringArray("1 2 3 1-2+*+3-"); text.outPutCalculate(); System.out.println(text.postfix()); } }
输出结果:
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。