`
郑云飞
  • 浏览: 823301 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java计算器

阅读更多
package a2;
import java.io.*;
public class Calc
{
	public static void main(String[] args) throws IOException
	{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		System.out.println("请输入要计算的式子");
		String expression=br.readLine();
		int index=0;//字符串的下标索引
		StringBuffer sb=new StringBuffer(expression);//将字符串类型转换成stringBuffer类型
		if(sb.charAt(0)!='+'||sb.charAt(0)!='-')//如果字符串首位没有符号位,则自动添加上’+'
		{
			sb.insert(0, '+');
		}
		sb.append('+');
		while(index<sb.length())//循环遍历字符串的下标
		{
			if(sb.charAt(index)=='(')//每当遇到字符串中包含‘('
			{
				 sb.insert(index+1, '0');//就在’('的下一个位置添加一个0
				if(sb.charAt(index+2)!='-')//如果刚才添加的’0‘的下一个位置不是’-‘号的话,则自动添加上去一个’+‘
				{
					sb.insert(index+2, '+');
				}
			}
			if(sb.charAt(index)=='[')//将'['替换成’('
			{
				sb.replace(index, index+1, "(");
			}
			if(sb.charAt(index)==']')//将‘]'替换成')'
			{
				sb.replace(index, index+1, ")");
			}
			if(sb.charAt(index)=='{')//将’{‘替换成’('
			{
				sb.replace(index, index+1, "(");
			}
			if(sb.charAt(index)=='}')//将‘}’替换成‘)'
			{
				sb.replace(index, index+1, ")");
			}
			index++;
		}
		Comput com=new Comput(sb);
		double result=com.compute();
		System.out.println("结果:"+result);
	}
}

 

package a2;

import java.util.ArrayList;
import java.util.Arrays;

public class Comput
{
	//表达式
	private StringBuffer expression;
	//运算符栈
	private MyStack<Character> op=new MyStack();
	//运算数栈
	private MyStack<Double> oprands=new MyStack();
	//运算符压站方案
	double a=0,b=0;
	
	public void op_Push(Oparation p)
	{
		//如果运算符栈为空
		if(oprands.isEmpty())
		{
			oprands.push(a);
			oprands.push(b);
			
			//将结果压入继续压入栈中
			oprands.push(a+b);
		}
		if(op.isEmpty())
		{
			//待入站的运算符直接入栈
			op.push(p);
		}
		else
		{
			   
			//带入站的和为入站的优先级比较
			//查看栈顶
			Oparation top=(Oparation)op.peek();
			//比较将要入栈的与栈顶的优先级别
			int com=p.getPro()-top.getPro();
			//如果待入站的运算符级别高,直接入站
//			if(com>0)
//			{
//				//直接压站
//				op.push(p);
//			}
//			//如果待入栈的运算符级别低,则运算符出栈计算(同时二个数需要出栈)
//			else
//			{
//				//弹出二个数
//				//声明运算数栈顶的二个数
//				int a=(Integer)oprands.pop();
//				int b=(Integer)oprands.pop();
//				//声明运算符栈顶的运算符
//				Oparation t=(Oparation) op.pop();
//				//出栈的二个数进行计算
//				int result=t.computting(b,a);
//				//将结果压入继续压入栈中
//				oprands.push(result);
//				//运算符出栈
//				op_Push(p);
//			}
		
			if(com>0)
			{
				//入栈
				op.push(p);
			}
			else
			{
				if(top.getType()=='(')
				{
					//入栈
					op.push(p);
				}
				else
				{
					if(com>-10)
					{
						//出栈
						op_Pop();
						op_Push(p);
							
					}
					else
					{
						//一直出栈至‘(
						while(((Oparation)op.peek()).getType()!='(')
						{
							  op_Pop();
							
						}
						//将栈顶’(‘扔出
						op.pop();
						
					}
				}
			}
		}
	}
	private void op_Pop()
	{
		//声明运算数栈顶的二个数
	    a=oprands.pop();
	    b=oprands.pop();
		//声明运算符栈顶的运算符
		Oparation t=op.pop();
		//出栈的二个数进行计算
		double result=t.computting(b,a);
		//将结果压入继续压入栈中
		oprands.push(result);
	}
	public Comput(StringBuffer sb)
	{
		super();
		this.expression = sb;
	}
	//解析运算
	public double compute()
	{
	 int index=0;
	 int length=expression.length();
	 char ch='\0';
	 String num ="";
	 while(index<length)//循环遍历表达式的每一位
	 {
			 ch=expression.charAt(index);//循环字符变量
			 switch(ch)
			 {
				 case '+':
				 {
					 op_Push(Oparation.ADD);//将加号的优先级压入运算符栈中
					 index++;
					 break;
				 }
				 case '-':
				 { 
					 op_Push(Oparation.DEC);//将减号的优先级压入运算符栈中
					 index++;
					 break;
				 }
				 case '*':
				 {
					 op_Push(Oparation.RIDE);//将乘号的优先级压入运算符栈中
					 index++;
					 break;
				 }
				 case '/':
				 {
					 op_Push(Oparation.DIV);//将除号的优先级压入运算符栈中
					 index++;
					 break;
				 }
				 case '%':
				 {
					 op_Push(Oparation.qy);//将求余号的优先级压入运算符栈中
					 index++;
					 break;
				 }
				 case '(':
				 {
					 op_Push(Oparation.lp);//将左括号的优先级压入运算符栈中
					 index++;
					 break ;
				 }
				 case ')':
				 {
					 op_Push(Oparation.rp);//将右括号的优先级压入运算符栈中
					 index++;
					 break;
				 }
				 default://合并数字位使其成为一个实数
				 { 
					   while(ch>='0'&&ch<='9'||ch=='.')
					   {
						   num+=ch;
						   index++;
						   if(index<length)
						   {
						     ch=expression.charAt(index);
						   }
						   else
						   {
							   break;
						   }
					   }
					   oprands.push(Double.parseDouble(num));//将数字直接压入运算数栈中
					   num="";//清空,便于下次存放内容
				 }
		 }
	 }
	 while(!op.isEmpty())
	 {
		 double a=0,b=0;//声明运算数栈顶的二个数
		 if(op.equals('('))
		 {
			 op.pop();//如果栈顶是‘('号,直接将'('弹出栈
		 }
		 else//运算符出栈时,需要弹出二个数进行运算(但是’('出栈时不参与运算符的计算)
		 {
			 a=oprands.pop();//声明运算数栈顶的一个数(用于出栈运算)
			 b=oprands.pop();//声明运算数栈顶的另外一个数(用于出栈运算)
			 Oparation t= op.pop();//声明运算符栈顶的运算符
		     double result=t.computting(b,a);//出栈的二个数进行计算
			 oprands.push(result);//将结果压入继续压入栈中
		 }
	 }
	 return oprands.pop();//返回运算数栈顶的最后一个数,即是最后的运算结果
	}
}

 

package a2;
import java.util.ArrayList;
import java.util.LinkedList;
public class MyStack<T>
{
		//存储空间
		//private LinkedList ll=new LinkedList();
	     private ArrayList ll=new ArrayList();
		//出栈 弹栈
		public <T> T pop()
		{
			//return ll.removeLast();
			return (T) ll.remove(ll.size()-1);
		}
      //入栈 压栈
		public void push(Object o)
		{
			//ll.addLast(o);
			ll.add(o);
		}
		//查看栈顶
		public <T> T peek()
		{
			//return ll.getLast();
			return (T) ll.get(ll.size()-1);
		}
		//为空?
		public boolean isEmpty()
		{
			return ll.isEmpty();
		}
	

}

 

package a2;
public class Oparation
{
	public static final Oparation ADD=new Oparation('+',0);
	public static final Oparation DEC=new Oparation('-',0);
	public static final Oparation RIDE=new Oparation('*',1);
	public static final Oparation DIV=new Oparation('/',1);
	public static final Oparation qy=new Oparation('%',1);
	public static final Oparation lp=new Oparation('(',10);
	public static final Oparation rp=new Oparation(')',-10);
	//运算符类型
  private char type;
  //运算符优先级
  private int pro;
  public char getType()
  {
  	return type;
  }
  public int getPro()
  {
  	return pro;
  }
  private  Oparation(char type, int pro)
  {
  	super();
  	this.type = type;
  	this.pro = pro;
  }
  //运算方案
  public double computting(double a,double b)
  {
	  switch(this.type)
	  {
		  case '+':
		  {
			    return a+b;
		  }
		  case '-':
		  {
				  return a-b;
		  }
		  case '*':
		  {
			  return (a)*(b);
		  }
		  case '/':
		  {
			 return (a)/(b);
		  }
		  case '%':
		  {
			  return a%b;
		  }
		  default:
		  {
			  System.out.println("运算符有误");
			  System.exit(-1);
			  return 0;
		  }
	  }
  }
}

 

分享到:
评论

相关推荐

    java计算器代码(gui界面)

    java计算器代码,初学者专用java计算器代码,初学者专用java计算器代码,初学者专用java计算器代码,初学者专用java计算器代码,初学者专用java计算器代码,初学者专用java计算器代码,初学者专用

    JAVA计算器 报告和程序

    JAVA 计算器 实验报告书,内附完整代码,可用。

    java计算器java计算器

    java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器

    java计算器实验报告

    在这个“Java计算器实验报告”中,我们探讨了一个基于Java编程语言的计算器应用程序的开发过程。这个实验的主要目标是设计一个用户界面,实现基本的数学运算,包括加法、减法、乘法和除法,同时处理可能出现的异常...

    java 计算器(已实现)

    java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器

    java计算器程序代码

    Java 计算器程序代码解析 Java 计算器程序代码是 Java 课上老师提供的编译源代码,内容详细,适合研究学习。下面对代码的标题、描述、标签和部分内容进行详细解析。 标题解析 Java 计算器程序代码的标题为“Java ...

    java计算器,带历史记录功能

    在这个项目中,我们看到的"java计算器,带历史记录功能"显然包含了一个核心的类——`Computer.java`,这个类可能实现了计算器的所有逻辑和界面。 首先,`Computer.java`文件很可能是主程序的入口点,它可能继承自...

    用AWT包实现的JAVA计算器

    本项目“用AWT包实现的JAVA计算器”旨在通过AWT来构建一个功能完备的计算器应用。下面将详细介绍这个项目中的关键知识点。 1. **AWT组件**: - AWT提供了各种基本组件,如按钮(Button)、文本字段(TextField)、...

    java计算器+报告

    【标题】"java计算器+报告"揭示了这个项目的核心内容,即一个用Java语言实现的计算器程序,并且包含了相应的项目报告。这表明该程序不仅是一个简单的计算工具,可能还涉及了高级功能,如复杂数学运算、图形界面或者...

    java计算器 期末作业

    【Java计算器实现详解】 在Java编程的学习过程中,创建一个计算器是一项常见的练习任务,它能帮助学生深入理解面向对象编程的概念,以及如何处理用户输入和输出。这个“java计算器”项目,作为期末作业,旨在检验...

    JAVA计算器 课程设计报告

    《JAVA计算器课程设计详解》 在计算机编程领域,设计并实现一个计算器程序是常见的课程设计任务,这有助于学习者深入理解编程语言的基本语法和逻辑控制。在这个Java计算器课程设计报告中,我们将探讨如何构建一个...

    Java计算器实训报告

    Java计算器实训报告旨在通过设计和实现一个计算器程序,让学生深入理解和掌握Java编程语言以及面向对象设计的基本原理。这个计算器分为普通计算器和科学计算器两种模式,提供了丰富的数学运算功能。 在需求分析部分...

    手机上的JAVA计算器

    Java计算器是基于Java编程语言开发的一款简单应用,适用于智能手机用户。它通常包含了基本的数学运算功能,如加、减、乘、除,以及可能的更高级功能,如求平方根、指数运算、对数等。在Java中实现计算器涉及到许多...

    java 计算器 源代码

    Java计算器源代码是一个典型的编程项目,它展示了如何在Java中实现一个简单的图形用户界面(GUI)应用程序,用于执行基本的算术运算。这个项目通常包括加、减、乘、除等基本功能,以及可能的括号支持和错误处理。...

    java 计算器 实验报告

    **实验报告:简易Java计算器制作** 一、实验目的及要求 本实验旨在加深对Java编程语言的理解,特别是其面向对象编程特性。通过设计并实现一个简单的计算器,学习者将掌握以下知识点: 1. Java基本语法:包括变量...

    带有清零功能的小型JAVA计算器完整源代码!

    Java 计算器完整源代码实现详解 在本资源中,我们将实现一个完整的 Java 计算器应用程序,该应用程序具有基本的计算功能,如加、减、乘、除、清零等。下面我们将详细解释该应用程序的实现细节。 Java Swing 框架 ...

    Calculator_java计算器_

    在本项目中,我们讨论的是一个使用Java编程...以上就是构建一个Java计算器应用时涉及的主要技术点。通过这个项目,开发者可以巩固对Java语言的理解,增强面向对象编程的实践能力,以及提升处理用户输入和异常的能力。

    java 计算器 小程序(精简版)

    通过以上知识点的解释,我们可以理解这个Java计算器小程序的基本工作原理。实际的源代码会包含类定义、方法实现以及具体的逻辑处理,对于学习Java编程和理解程序设计思路是非常有价值的。如果你对Java编程感兴趣,...

    简易计算器.rar_java 计算器_java 计算_java计算器_计算器

    【描述】"简易的JAVA计算器" 提供了一个直观的示例,展示了如何在Java中设计一个用户界面以及处理用户的输入和输出。这个项目可能包含了一个独立的源代码文件(Calculator.java)和编译后的类文件(Calculator.class...

Global site tag (gtag.js) - Google Analytics