java实现整数计算器

计算器代码

package stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class PolandNotation {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//中缀转后缀
		Scanner in =new Scanner(System.in);
		System.out.println("请输入一个计算式:");
		String exepression=in.next();
		List<String> ls=toInfixExpressionList(exepression);
		System.out.println(ls);
		List<String> parsesiffixexpression=parseSuffixExpressionList(ls);
		System.out.println("后缀表达式对应的List:"+parsesiffixexpression);
		System.out.printf("运算结果%d
",calculate(parsesiffixexpression));
		
	}
	
	
	public static List<String> parseSuffixExpressionList(List<String> ls){
		//符号栈
		Stack<String> s1=new Stack<String>();
		//储存中间结果
		List<String> s2=new ArrayList<String>();
		//遍历
		for(String item:ls) {
			//如果是一个数就加入s2
			if(item.matches("\d+")) {
				s2.add(item);
			}else if(item.equals("(")) {
				s1.push(item);
			}else if(item.equals(")")){
				//依次弹出
				while(!s1.peek().equals("(")) {
					s2.add(s1.pop());
				}
				s1.pop();//消掉小括号,消除小括号
				
			}else {
				//优先级的问题
				//当item的优先级小于等于栈顶的优先级
				//缺少一个比较优先级高低的方法
				while(s1.size()!=0&&Operation.getValue(s1.peek())>=Operation.getValue(item)) {
					s2.add(s1.pop());
					
				}
				//还需要将item栈中
				s1.push(item);
			}
			
			
		}
		
		while(s1.size()!=0) {
			s2.add(s1.pop());
		}
		return s2;
		
	}
	
	
	
	
	//将中缀表达式转化为对应的List
	public static List<String> toInfixExpressionList(String s){
		List<String> ls=new ArrayList<String>();
		int i=0;
		String str;
		char c;
		do {
			//如果c一个非数字,就需要加入到ls中去
			if((c=s.charAt(i))<48||(c=s.charAt(i))>57) {
				ls.add(""+c);
				i++;
			}else {//如果是一个数字
				str="";//先将字符串置空
				while(i<s.length()&&(c=s.charAt(i))>=48&&(c=s.charAt(i))<=57) {
					str+=c;//拼接
					i++;
				}
				ls.add(str);
			}
			
		}while(i<s.length());
		
		
		return ls;
	}
	
	public static int calculate(List<String> ls) {
		Stack<String> stack=new Stack<String>();
		for(String item :ls) {
			if(item.matches("\d+")) {//多位数直接入栈
				stack.push(item);
				
			}else {
				//pop出两个数组
				int num2=Integer.parseInt(stack.pop());
				int num1=Integer.parseInt(stack.pop());
				int res=0;	
				if(item.equals("+")) {
					res=num1+num2;
					stack.push(""+res);
				}
				else if(item.equals("-")) {
					res=num1-num2;
					stack.push(""+res);
				}
				else if(item.equals("*")) {
					res=num1*num2;
					stack.push(""+res);
				}
				else if(item.equals("/")) {
					res=num1/num2;
					stack.push(""+res);
				}
				
			} 
		}
		return Integer.parseInt(stack.peek());
	}
	

}

//编写一个了类返回一个运算符号的优先级

class Operation{
	private static int ADD=1;
	private static int SUB=1;
	private static int MUL=2;
	private static int DIV=2;
	
	//写一个方法,返回对应优先级的数字
	public static int getValue(String oper) {
		int result=0;
		switch (oper) {
		case "+":
			result=ADD;
			break;
		case "-":
			result=SUB;
			break;
		case "*":
			result=MUL;
			break;
		case "/":
			result=DIV;
			break;

		default:
			System.out.println("不存在该运算符号");
			break;
		}
		return result;
	}
	

}

原文地址:https://www.cnblogs.com/mengxiaoleng/p/11630207.html