• 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;
    	}
    	
    
    }
    
    
  • 相关阅读:
    Twitter网站架构学习笔记
    优化和架构之服务切分
    现代浏览器的工作原理
    可伸缩性原则
    图解:2013年百度搜索引擎工作原理
    构建的可伸缩性和达到的性能:一个虚拟座谈会
    提升可伸缩性的8项最佳实践
    Oracle odbc配置
    Oracle Error
    java与java web数组括号的不同
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/11630207.html
Copyright © 2020-2023  润新知