利用栈实现算术表达式求值(Java语言描述)
来源:互联网 发布:mfc编程实例pdf 编辑:程序博客网 时间:2024/05/18 02:16
利用栈实现算术表达式求值(Java语言描述)
算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识。声明:部分代码参考自茫茫大海的专栏。
链栈的实现:
package 算数表达式求值;public class Stack<T> {//节点类public class Node{public T data;public Node next;public Node(){}public Node(T data,Node next){this.data = data;this.next = next;}}//Nodepublic Node top = new Node();public int size;public Node oldNode;//入栈public void push(T element){top = new Node(element,top);size++;}//出栈public T pop(){oldNode = top;top = top.next;//oldNode = null;size--; return oldNode.data;}//返回栈顶对象的数据域,但不出栈public T peek(){return top.data;}//栈长public int length(){return size;}//判断栈是否为空public boolean isEmpty(){return size == 0;}}
表达式求值的实现:
package 算数表达式求值;import java.util.Scanner;//import java.util.Stack;public class Expression {//运算符之间的优先级,其顺序是+、-、*、/、(、),其中大于号表示优先级高//,小于号表示优先级低,等号表示优先级相同,感叹号表示没有优先关系public static final char[][] relation = {{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},{'>','>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=','!'},{'>','>','>','>','!','>','>'},{'<','<','<','<','<','!','='}};public static void main(String[] args) {Scanner input = new Scanner(System.in);while(true){try{System.out.println("请输入要计算的表达式:");String exp = input.next();System.out.println(calc(exp + "#"));}catch(ArithmeticException e1){System.out.println("表达式中的分母不能为0");e1.printStackTrace();}}}/** * * @param exp 要计算的表达式 * @return 计算的结果 */private static int calc(String exp) {//操作数栈Stack<Integer> num = new Stack<Integer>();//操作符栈Stack<Character> op = new Stack<Character>();op.push('#');int i = 0;char ch = exp.charAt(i);boolean flag = false;//判断连续的几个字符是否是数字,若是,就处理成一个数字。这样就能处理多位数的运算了。while(ch != '#' || op.peek() != '#') {//peek()查看栈顶对象但不移除。if(ch >= '0' && ch <= '9') {if(flag) {int tmp = num.pop();num.push(tmp * 10 + Integer.parseInt(ch + ""));} else {num.push(Integer.parseInt(ch + ""));}flag = true;i++;} else {flag = false;switch(precede(op.peek(), ch)) {case '<':op.push(ch);i++;break;case '=':op.pop();i++;break;case '>':int num2 = num.pop();int num1 = num.pop();int result = operate(num1, op.pop(), num2);num.push(result);break;case '!':System.out.println("输入的表达式错误!");return -1;}}ch = exp.charAt(i);}return num.peek();}private static char precede(char peek, char ch) {return relation[getIndex(peek)][getIndex(ch)];}/** * * @param ch 操作符 * @return 操作符的索引,按照+、-、*、/、(、)的顺序 */private static int getIndex(char ch) {int index = -1;switch(ch) {case '+':index = 0;break;case '-':index = 1;break;case '*':index = 2;break;case '/':index = 3;break;case '(':index = 4;break;case ')':index = 5;break;case '#':index = 6;break;}return index;}/** * * @param num1 第一个运算数 * @param ch 运算符 * @param num2 第二个运算数 * @return 运算结果 */private static int operate(int num1, char ch, int num2) {int result = 0;switch(ch) {case '+':result = num1 + num2;break;case '-':result = num1 - num2;break;case '*':result = num1 * num2;break;case '/':result = num1 / num2;break;}return result;}}
异常处理有待完善,引用请指明出处。
0 0
- 利用栈实现算术表达式求值(Java语言描述)
- 利用栈实现算术表达式求值(Java语言描述)
- 利用栈实现简单算术表达式求值
- 利用栈实现算术表达式的求值
- 栈的操作和c语言实现算术表达式求值
- 算术表达式求值(顺序栈实现)
- 算术表达式求值(中缀转后缀,后缀求值,java 栈实现)
- 利用栈实现的后缀形式的算术表达式的求值的c++程序
- Java 字符串算术表达式求值
- Java 字符串算术表达式求值
- Java 字符串算术表达式求值
- 栈的算术表达式求值
- 双栈算术表达式求值
- 数据结构Java实现——①栈-->栈的应用三、算术表达式求值
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (转载)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 算术表达式求值(C语言)
- 设备管理系统
- 设计原则之一:单一职责原则(SRP)
- 数据结构练习---java实现普通矩阵与稀疏矩阵的矩阵转置,矩阵加法,矩阵乘法,应用简单工厂与模板方法。
- 如何将图片上的文字转换为Word上的文字
- 部分 TCP 内核参数彻底了解
- 利用栈实现算术表达式求值(Java语言描述)
- kalman滤波 简介
- Hibernate 如何操纵持久化对象
- 第五周项目项目1 电阻串联
- 数据报和数据包
- 怎样判断JDK已经安装成功
- thinkphp之Ajax提交和返回
- C++释放内存的问题
- vector(容器)、list(列表)、deque(双向队列)的区别与比较