带括号的四则运算

..这是我刚学数据结构时编写的。手法可能有点粗糙

import java.util.*;


public class operation {//计算包括括号的四则运算公式  15*15-12-(5+1+2*3)
	//简单四则计算器纯字符串
	public String count(String a,String b,String c){
		String num=null;
		double num1;
		double num2;
		if(c.equals("+")){
			num1=Double.parseDouble(a);
			num2=Double.parseDouble(b);
			num = String.valueOf(num1+num2);
		}else if(c.equals("-")){
			num1=Double.parseDouble(a);
			num2=Double.parseDouble(b);
			num = String.valueOf(num1-num2);
		}else if(c.equals("*")){
			num1=Double.parseDouble(a);
			num2=Double.parseDouble(b);
			num = String.valueOf(num1*num2);
		}else if(c.equals("/")){
			num1=Double.parseDouble(a);
			num2=Double.parseDouble(b);
			num = String.valueOf(num1/num2);
		}
	return num;
	}
	
	
	// 1:计算           2:压栈           3:删除栈顶元素
	public int priority(Stack fu,String a){
		//栈为空当然是没办法计算的//一定要先判断是否为空在判断# 为空时没有运算符无法计算
		if(fu.isEmpty()){
			return 2;
		}else if(a.equals("#")){
			return 1;
		}
		
		String temp=fu.data.get(fu.top);
		if(a.equals("+")||a.equals("-")){
			
			if(temp.equals("(")||temp.equals(")")){
				return 2;
			}else{
				return 1;
			}
		}else if(a.equals("*")||a.equals("/")){
			if(temp.equals("*")||temp.equals("/")){
				return 1;
			}else{
				return 2;
			}
		}else if(a.equals("(")){
			return 2;
		}else if(a.equals(")")){
			if(temp.equals("(")){
				return 0;
			}else{
				return 1;
			}
		}

		System.out.println("发生不可预知错误");
		return 0;
	}
	
	
	public void start(){
		 Scanner input = new Scanner(System.in);
		 Stack num = new Stack();
		 Stack fu = new Stack();
		 //输入时结束位置放#号
		 String expression = input.next();
		 expression+="#"; //自动加上#号
		 //将数字和操作符分离放进数组
		 ArrayList<String> exp = new ArrayList<String>();
		 String one="";
		 for(int i=0;i<expression.length();i++){
			 char one1=expression.charAt(i);
			 	if(one1=='+'||one1=='-'||one1=='*'||one1=='/'||one1=='('||one1==')'||one1=='#'){
			 		if(!one.equals("")){
			 			exp.add(one);
				 		one="";
			 		}
			 		exp.add(String.valueOf(one1));
			 	}else{
			 		one+=String.valueOf(one1);
			 	}
			 	
			 	//当最后是#号时已经不需要做最后的判断
//			 	if(i==expression.length()-1){
//			 		if(!one.equals("")){
//			 			exp.add(one);
//				 		one="";
//			 		}
//			 	}
		 }
		 int i=0;
		 while(i<exp.size()){//表达式遍历结束
			 String three=exp.get(i);//表达式当时位置的值
			 if(i<exp.size()){i++;}
			 if(!(three.equals("+")||three.equals("-")||three.equals("*")||three.equals("/")||three.equals("(")||three.equals(")")||three.equals("#"))){//遇见数值直接压栈
				 //不是+-*/#只能是数字
				 num.push(three);
			 }else{
				
				 //当可以计算时持续计算,直到优先级别不够或遇见括号
				 int temp=priority(fu,three);
				 //判断是否能计算可以就计算不可以压栈
				 while(temp==1){
					 String num1=num.pop();
					 String num2=num.pop();
					 String num3=fu.pop();
					 String two=count(num2,num1,num3);
					 
					 num.push(two);//计算完毕后将计算结果压进栈
					 
					 temp=priority(fu,three);//判断下一个符号是否合适计算
				 }
				 if(temp==2){//当没有合适的运算符时压栈
					 fu.push(three);
				 }else if(temp==0){//只剩下(括号没有必要留下
					 fu.pop();
				 }
				 
				 }
			 }
		 System.out.println();
		System.out.println(num.pop());//输出结果
		
		 
		 } 
	
		public static void main(String[] args){
			operation test  = new operation();
			test.start();
			
		}	 
	
}

class Stack{//不考虑栈满
	
	
	ArrayList<String> data = new ArrayList<String>();
	int top=-1;
	public boolean isEmpty(){
		if(top==-1){
			return true;
		}else{
			return false;
		}
	}
	
	public	void push(String x){
		++top;
		data.add(x);
	}
	
	public String pop(){
		if(isEmpty()){
			System.out.println("栈空");
			return null;
		}else{
			return  data.remove(top--);
		}
	}

	
}



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUNbrightness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值