package dataStructures.list;
import java.util.Stack;
public class ReversePolishTest {
private Stack<Integer> stack;
ReversePolishTest(){
stack=new Stack<Integer>();
}
/**
* 如果为计算符号,返回true,否则返回false
* @param c
* @return
*/
public boolean isOperation(char c) {
if('+'==c||'-'==c||'*'==c||'/'==c||'%'==c) {
return true;
}
return false;
}
/**
* int类型转换为char类型,不能使用强制转换
* @param i
* @return
*/
private char intParseChar(Integer i) {
String s=i.toString();
char[] c =s.toCharArray();
Character ch=null;
for (char d : c) {
if(ch==null) {
ch=d;
}else {
ch=(char) (ch+d);
}
}
return ch;
}
/**
* char类型转换为int类型,通过String转换
* @param c
* @return
*/
private int charParseInt(Character c) {
String s=c.toString();
return Integer.parseInt(s);
}
private int operate(char c,int a,int b) {
if('+'==c) {
return a+b;//Integer.sum(a, b);
}else if ('-'==c) {
return a-b;
}else if('*'==c) {
return a*b;
}else if ('/'==c) {
return a/b;
}else {
return a%b;
}
}
/**
* 后缀算法计算
* @param string
* @return
*/
private int sum(String string) {
int length=string.length();
for (int i = 0; i < length; i++) {
char c = string.charAt(i);
if(' '==c) {//遇到空格直接结束本次循环
continue;
}else if(!isOperation(c)) {
String ss=String.valueOf(c);//考虑到多位整数(123)类型,所以需要循环拿出此位置上整数全值
while(i+1<=length-1) {//避免越界异常,需要求i+1<=length-1
char d=string.charAt(i+1);//获取下一个节点信息
if(Character.isDigit(d)) {//判断是否为数值
ss= ss+String.valueOf(d);//添加到字符串中
stack.push(Integer.parseInt(ss));//转换为整数后进栈
++i;//外循环跳过一次
}else{
stack.push(Integer.parseInt(ss));//如果下一个节点不为整数,则直接进栈且跳出当前循环
break;
}
}
}else{
if(!stack.isEmpty()) {//计算开始,每次取出栈顶的2个数据,然后根据算数符号来计算,计算结果入栈
Integer d=(Integer)stack.pop();
Integer e=(Integer)stack.pop();
int f=operate(c,e,d);
stack.push(f);
}
}
}
return stack.pop();
}
public static void main(String[] args) {
ReversePolishTest test =new ReversePolishTest();
System.out.println(test.sum("111 2 % 3 +"));
}
}
后缀表达式(逆波兰式)实现计算功能
最新推荐文章于 2023-10-02 13:48:51 发布