java后缀表达式实现表达式求值

Python010

java后缀表达式实现表达式求值,第1张

import java.util.Scanner

import java.util.Stack

public class 表达式计算 {

private static Stack<String>num = new Stack<String>()//存后缀表达式

private static Stack<String>sign = new Stack<String>()//存入符号

private static Stack<Integer>result = new Stack<Integer>()//放结果

public static void getGroup(String line){//讲字符串转换为后缀表达式

for(int i=0i<line.length()i++){

char c = line.charAt(i)

if((int)c>=48 &&(int)c<=57){//当遇到数字的时候,判断是不是多位数,然后在push进num

int j = i+1

while(j<line.length() &&(line.charAt(j)>=48 &&line.charAt(j)<=57)){

j++

}

num.push(line.substring(i, j))

i = j-1

}else if(c == '('){//遇到左括号直接存进num

sign.push(String.valueOf(c))

}else if(c == ')'){//遇到右括号从sign中pop栈顶元素push到num知道遇到'(',然后再pop掉'('

while(!sign.peek().equals("(")){

num.push(sign.pop())

}

sign.pop()

}else{

int n = 0

if(!sign.empty()){//如果sign中没有元素,直接令n = 0

n = getNum(sign.peek().charAt(0))

}

int m = getNum(c)

if(m >= n){//如果当前元素的运算级别比栈顶元素运算级别要高,就直接push进sign

sign.push(String.valueOf(c))

}else{

while(m <n){//如果当前运算运算级别比sign栈顶元素运算级别要低,就将sign栈顶元素pop并且push进num,知道不符合条件

num.push(sign.pop())//输入例子2*3+6/3的时候,这里一直报错

if(!sign.empty()){

n = getNum(sign.peek().charAt(0))

}else{

n = 0

}

}

sign.push(String.valueOf(c))

}

}

}

while(!sign.empty()){

num.push(sign.pop())

}

}

private static int getNum(char c){

int n = 0

switch(c){

case '+':

case '-':

n = 1

break

case '*':

case '/':

n = 2

break

}

return n

}

你好!

后缀表达式也称逆波兰表达式,其优点就在于可以方便的用栈实现表达式的值的计算。和你说一下思路吧:

·从头读入表达式

·如果遇到数则将其压入栈

·如果遇到运算符,从栈中弹出栈顶连个数,实行相应运算,将结果压入栈中

·直到表达式尾,此时栈中应该只有一个元素,即运算结果

·Over

如果对你有帮助,望采纳。