java四则运算

  最近老师要写四则运算,通过自己的理解终于完成了,绝对是最容易懂的四则运算!  首先将运算式分解长一个一个的字符串再加入到一个队列里面,再建立两个站,一个用来存储运算数,一个存放运算符,其中比较运算符的关系是关键,如果栈顶元素优先级底,则从队列里面得到的运算符会直接进栈,如果相等则是要消除(),大于就是要进行出栈运算,将结果再加入到运算数栈中去,直到得到运算符栈中为#和list为空为止。  上代码:package demo2;

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

public class EvaluateExpression {

	public static void main(String[] args) {
		String s="(3*2+(20-12))/2+(2+3)";

		EvaluateExpression  e=new EvaluateExpression ();
		System.out.println("计算结果为:"+e.Evaluate(e. makeList(s)));

	}
	public List<String> makeList(String str){
		List<String> list = new ArrayList<String>();
		String temp="";
		for(int i=0;i<str.length();i++){
			char ch=str.charAt(i);

			//判断是否为数字
			if (Character.isDigit(ch)) {
                temp+=String.valueOf(ch);
            }else{
            	if(!temp.equals("")){
            		list.add(temp);
            	}
            	list.add(String.valueOf(ch));
            	temp="";
            }
		}
		if(!temp.equals("")){
    		list.add(temp);
    	}
	list.add("#");
		return list;
	}
	public 	String compare(String str1,String str2){
		switch(str1){
			case "+":
				if(str2.equals("+"))
					return ">";
				if(str2.equals("-"))
					return ">";
				if(str2.equals("*"))
					return "<";
				if(str2.equals("/"))
					return "<";
				if(str2.equals("("))
					return "<";
				if(str2.equals(")"))
					return ">";
				if(str2.equals("#"))
					return ">";
				break;
			case "-":
				if(str2.equals("+"))
					return ">";
				if(str2.equals("-"))
					return ">";
				if(str2.equals("*"))
					return "<";
				if(str2.equals("/"))
					return "<";
				if(str2.equals("("))
					return "<";
				if(str2.equals(")"))
					return ">";
				if(str2.equals("#"))
					return ">";
				break;
			case "*":
				if(str2.equals("+"))
					return ">";
				if(str2.equals("-"))
					return ">";
				if(str2.equals("*"))
					return ">";
				if(str2.equals("/"))
					return ">";
				if(str2.equals("("))
					return "<";
				if(str2.equals(")"))
					return ">";
				if(str2.equals("#"))
					return ">";
				break;
			case "/":
				if(str2.equals("+"))
					return ">";
				if(str2.equals("-"))
					return ">";
				if(str2.equals("*"))
					return ">";
				if(str2.equals("/"))
					return ">";
				if(str2.equals("("))
					return "<";
				if(str2.equals(")"))
					return ">";
				if(str2.equals("#"))
					return ">";
				break;

			case "(":
				if(str2.equals("+"))
					return "<";
				if(str2.equals("-"))
					return "<";
				if(str2.equals("*"))
					return "<";
				if(str2.equals("/"))
					return "<";
				if(str2.equals("("))
					return "<";
				if(str2.equals(")"))
					return "=";
				if(str2.equals("#"))
					return ">";
				break;
			case ")":
				if(str2.equals("+"))
					return ">";
				if(str2.equals("-"))
					return ">";
				if(str2.equals("*"))
					return ">";
				if(str2.equals("/"))
					return ">";
				if(str2.equals(")"))
					return ">";
				if(str2.equals("#"))
					return ">";
				break;
			case "#":
				if(str2.equals("+"))
					return "<";
				if(str2.equals("-"))
					return "<";
				if(str2.equals("*"))
					return "<";
				if(str2.equals("/"))
					return "<";
				if(str2.equals("("))
					return "<";
				break;
		}
		return null;
	}
	public boolean isHave(String s){
		String[] strs={"+","-","*","/","(",")","#"};
		for(int i=0;i<strs.length;i++){
			if(strs[i].indexOf(s)!=-1){
			return true;
			}
			}
			return false;
	}

	public String Evaluate(List<String> list){

	Stack<String> stack0=new Stack<String>();//运算数栈
	Stack<String> stack1=new Stack<String>();//运算符栈
	stack1.push("#");
	String 	str=list.remove(0);

	while((!stack1.peek().equals("#")) ||  (!list.isEmpty())){

		if(!this.isHave(str)){
			stack0.push(str);
			str=list.remove(0);
		}else{

			String str1=this.compare(stack1.peek(), str);

			switch(str1){
				case "<":
					stack1.push(str);
					str=list.remove(0);
					break;
				case "=":
					stack1.pop();
					str=list.remove(0);
					break;
				case ">":
					String ch=stack1.pop();
					int result=0;
					int ch1=Integer.parseInt(stack0.pop());
					int ch0=Integer.parseInt(stack0.pop());
					if(ch.equals("+"))
						result=ch0+ch1;
					if(ch.equals("-"))
						result=ch0-ch1;
					if(ch.equals("*"))
						result=ch0*ch1;
					if(ch.equals("/"))
						result=ch0/ch1;
					stack0.push(String.valueOf(result));
					break;
			}
			}

	}

	return stack0.peek();
	}

}运算结果截图:

版权声明:本文为博主原创文章,转载请声明。


  

时间: 2024-10-26 23:19:52

java四则运算的相关文章

Java四则运算表达式求解

压栈思想计算Java运算表达式 栈的规则是先进后出.利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字.一个用来存放对应的操作符.假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符.或者就是括号了.然后我们从左至右遍历每一个元素,遍历过程中遵循步骤和原则如下: (1)遇到数字则直接压到数字栈顶. (2)遇到运算符(+-*/)时,若操作符栈为空,则直接放到操作符栈顶,否则,见(3). (3)若操作符栈顶

(java) 四则运算(三)

要求: 1.学生写的程序必须能判定用户的输入答案是否正确, 例如程序输出:20 – 5 = ?用户输入15,那么程序就会反馈正确,然后继续出题.直到 30 道题目结束,程序最后告诉用户作对了几道题.2.程序必须能处理四种运算的混合算式:20 – 5 * 2 =?           正确答案是10.20– 5 * 2 + 9 / 3 = ?   正确答案是13 思路: 在(二)基础上改进 1.定义 SIZE 打印题数 2.定义是否有乘除法(用以改变随机符号范围) 3.定义加减有无负数(用以改变加

java四则运算----前缀、中缀、后缀表达式

接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现有点复杂,然后各种for,感觉非常不爽,于是问网上搜了下,发现一种叫波兰式的计算方法,瞬间茅塞顿开. http://blog.csdn.net/antineutrino/article/details/6763722 以下为原文引用 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.

java四则运算生成器

题目描述: 从<构建之法>第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24 运算符为 +, ?, ×, ÷ 并且要求能处理用户的输入,并判断对错,打分统计正确率. 要求能处理用户输入的真分数, 如 1/2, 5/12 等 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目 M

java四则运算写法

public class 四则运算{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.print("请输入第一个数字:"); int a = sc.nextInt(); System.out.print("请输入运算字符:"); String str = sc.next(); char ch = str.charAt(0); System.

软件工程课后作业——用JAVA编写的随机产生30道四则运算

1 package com.java.sizeyunsuan; 2 3 public class lianxi { 4 String f() 5 { 6 int i=(int)(Math.random()*10); 7 int j=(int)(Math.random()*10); 8 if(i>=j) 9 { 10 int temp=i; 11 i=j; 12 j=temp; 13 } 14 return(i+"/"+j); 15 } 16 public static void

java小学生四则运算带面板版 但我不知道为什么同类变量却进不了动作监听中去

---恢复内容开始--- 1 package yun; 2 import java.util.*; 3 import java.awt.*; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 7 import javax.swing.*; 8 public class number extends JFrame{ 9 10 /** 11 * 作者:范铭祥 12 * 功能:一个简单的小学生四

四则运算代码(java版本) 采用正则表达式

//加减乘除 负数.括号这几种//具体看代码以及注释 (测试没发现bug,如发现有bug 请指正) package com.test; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 四则运算,可能不是最优的写法,自己测试没发现bug<br> * 前提:正确的算式,因为没做算式的验证<br>

Java实验项目二——小学生考试系统(简单四则运算)

Program:设计实现一个小学生数学考试系统,完成随机出题(简单的四则运算),学生答题,自动判分的功能. Description:代码如下: 1 /* 2 * Description:面向考试系统建立类TestSystem 3 * 4 * */ 5 6 package entity; 7 8 public class TestSystem { 9 10 private int num1; //声明两个操作数 11 private int num2; 12 private String oper