`
爱在爪哇
  • 浏览: 7877 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

实现简单的四则混合运算

阅读更多
package cn.gao.algorithm2.service;

import java.util.ArrayList;

/**
 * 四则混合运算运算,如给定一个字符串"a+b*c-d/e",计算该表达式值
 * @param args
 */
public class Test11 {
	public ArrayList<Integer> objectList;/*保存操作数数组*/
	public ArrayList<Integer> operatorList;/*保存操作符数组*/
	public String s;/*保存四则运算表达式字符串*/
	
	public Test11(String s) {/*四则运算表达式测试类构造器*/
		super();
		this.s = s;
		objectList=new ArrayList<Integer>();
		operatorList=new ArrayList<Integer>();
	}
	public void prase()/*解析四则运算表达式字符串,将解析后的操作数及操作符分别保存在objectList和operatorList中*/
	{
		System.out.println("表达式为:"+s);
		int index=0;
		int object;
		int operatorIndex;
		while(index<=s.length()-1)
		{
			operatorIndex=getNextOperator(index);
			//System.out.println("sssssssss:"+operatorIndex);
			if(operatorIndex==-1)
			{
				object=getNumberWithRange(index,s.length());
				objectList.add(object);
			    break ; 
			}
			else{
				
				object=getNumberWithRange(index,operatorIndex);
				objectList.add(object);
				operatorList.add(Integer.valueOf(s.charAt(operatorIndex)));
				index=operatorIndex+1;
			}
		}
	  System.out.println("解析后的操作数: "+objectList);
	  System.out.println("解析后的操作符: "+operatorList);
	}
	public void caculate()/*根据已有的objectList和operatorList来就算表达式的值*/
	{

		ArrayList<Integer> objectList2=new ArrayList<Integer>();/*中间态操作数容器*/
		ArrayList<Integer> operatorList2=new ArrayList<Integer>();/*中间态操作符容器*/
		boolean flag=false;/*中间态状态辅助标志,标志上一次运算是优先级高的运算*/
		/*以下for循环是将objectList与operatorList里面的东西经过一次高级运算后过滤,将操作数及低级运算保存便于后续计算*/
		for(int i=0,j=0;i<objectList.size()&&j<operatorList.size();i++,j++)/*i,j分别指向当前操作数容器指针和当前操作符指针*/
		{
			int opertator=operatorList.get(j);
			int object=objectList.get(i);
			if(opertator=='*'||opertator=='/')/*处理优先级较高的运算*/
			{
			   	int one=objectList.get(i);
			   	int second=objectList.get(i+1);
			   	int result=getResultByOperator(one,second,opertator);
			   	if(result!=-1)
			   	{
			   		if(!flag)/*上次操作是普通优先级的*/
			   		{
			   	 		objectList2.add(result);
			   		}
			   		else{
			   			objectList2.remove(objectList2.size()-1);/*移除上次高优先级存的值*/
			   			objectList2.add(result);/*将二次高优先级的值存入*/
			   		}
			   		objectList.set(i+1, result);
			   		flag=true;
			   	}
			}
			else{
				if(!flag)
				{
					objectList2.add(object);
				}	
				operatorList2.add(opertator);
				flag=false;
			}
			
		}
		
		System.out.println("aaaaaa: "+objectList2);
		System.out.println("bbbbb: "+operatorList2);
		/*以下结算结果值*/
		int i;
		for(i=0;i<operatorList2.size();i++)
		{
			int one=objectList2.get(i);
			int second=objectList2.get(i+1);
			int operator=operatorList2.get(i);
			objectList2.set(i+1, getResultByOperator(one,second,operator));
		}
		System.out.println("表达式计算结果的值为:"+objectList2.get(i));
		
	}
	public int getResultByOperator(int one,int second,int operator)/*二目运算函数的抽象,根据制定的操作符及操作数得出结果返回*/
	{
		if(operator=='+')
		{
			return one+second;
		}
		if(operator=='-')
		{
			return one-second;
		}
		if(operator=='*')
		{
			return one*second;
		}
		if(operator=='/')
		{
			return one/second;
		}
		return -1;
	}
    public int getNumberWithRange(int startIndex,int endIndex)/*根据开头索引和结尾索引获得对应的整数值*/
    {
    	return Integer.parseInt(s.substring(startIndex, endIndex));
    }
	public int getNextOperator(int index)/*获取字符串当前index的下一个最近的操作符索引*/
	{
		if(index>=s.length()-1)
		{
		    return -1;	
		}
		while(index<=s.length()-1)
		{
		    if(isOperator(index))
		    {
		    	//System.out.println("获得当前操作索引符:"+s.charAt(index)+"索引位置:"+index);
		    	return index;
		    }
		    index++;
		}
		return -1;
	}
	public boolean isOperator(int index)/*判断当前索引操作数是否属于操作符*/
	{
		int temp=s.charAt(index);
		if('+'==temp||'-'==temp||'*'==temp||'/'==temp)
		{
			return true;
		}
		return false;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String s="1+2*3-8/4*2*2";
		Test11 t=new Test11(s);
		t.prase();
		t.caculate();
		
	}

}

 

分享到:
评论
1 楼 爱在爪哇 2012-05-27  
这里只是做了粗糙的四则运算处理,实际不止+ - * /这些运算符,可能对应不同级别S1,S2,...级别的运算符(这里只有二个运行级别:+,-以及*,/),以及不固定的操作符(这里都只是二目操作符),可以将以上问题抽象,然后精确处理思路如下:
设计2个栈,一个保存操作数的栈K1,一个保存操作符的栈K2,不断的解析表达式,进行词法分析,遇到和当前操作符栈同级别的操作符,则将当前操作符入K2,操作数入K1;如果当前运行级别大于当前,则对当前操作符进行分析,根据当前运算符性质及当前操作数得出结果入操作数栈;如果当前操作符的优先级小于当前操作符栈顶优先级,则对当前操作符进行操作运算,将结果入操作数栈,然后将这个较小优先级的操作符入操作符栈;直至终结解析完所有的操作符,操作符栈为空,这个时候运算完毕,操作数栈顶元素即为表达式运算结果。

相关推荐

    四则混合运算(简单计算器)C语言实现

    为了实现一个简单的四则混合运算计算器,我们需要定义两种类型的数据结构:一种用于存储字符串类型的运算符或数字,另一种用于存储整型数值。这两种数据结构都是基于栈来实现的。 #### 1. 字符串栈 定义了一个名为...

    c#版简单计算器(混合运算)

    在本文中,我们将深入探讨如何使用C#编程语言在Visual Studio 2003 (VS03)环境下创建一个简单的计算器程序,该程序能够执行基本的加法、减法、乘法以及除法的混合运算。这个项目对于初学者来说是很好的实践,因为它...

    C语言 四则混合运算程序

    本教程将聚焦于一个针对C语言初学者的简单但实用的程序——四则混合运算程序。这个程序允许用户进行加、减、乘、除的混合计算,是学习C语言控制流程、变量、数据类型和函数的好实践。 首先,让我们理解四则运算的...

    简单计算器四则混合运算

    该程序通过简单的布局和事件监听实现了基本的四则混合运算计算器功能。虽然代码结构较为基础,但很好地展示了Swing组件的基本用法和事件驱动编程的思想。此外,通过增加更多复杂的功能(如括号支持、更复杂的数学...

    c#实现四则混合运算

    在C#中,实现四则混合运算通常需要理解算法和数据结构,特别是二叉树和栈的概念。下面将详细阐述如何使用C#来实现这一功能。 首先,四则混合运算是基于算术运算符的优先级进行的,例如乘法和除法的优先级高于加法和...

    编译原理课程设计_四则混合运算_C语言

    在本项目“编译原理课程设计_四则混合运算_C语言”中,我们将探讨如何运用编译原理的基本概念,特别是SLR(简单左递归)文法和尾动作文法,来实现C语言中的四则混合运算。这个设计任务旨在帮助学生深入理解编译器的...

    一个用汇编语言程序设计的计算器,可以实现四则混合运算

    4. **条件判断**:为了实现混合运算,程序需要检查当前的操作符,这通常通过`CMP`指令比较寄存器或内存中的值来实现,然后根据比较结果跳转到相应的代码段执行下一步操作。 5. **循环控制**:对于复杂的表达式,...

    简单的计算器 用c#写的 实现了简单的混合运算

    在本文中,我们将深入探讨如何使用C#编程语言构建一个简单的计算器,该计算器能够执行基本的混合运算。C#是一种面向对象的、类型安全的、现代的编程语言,由微软公司开发,广泛应用于Windows应用程序、游戏开发、...

    Java综合程序设计——计算器(实现运算符优先级的四则混合运算)

    在本项目中,"Java综合程序设计——计算器(实现运算符优先级的四则混合运算)"是一个典型的软件开发任务,旨在实现一个功能丰富的计算器,包括基础的四则运算以及更复杂的数学操作如对数和平方根。这个计算器的关键...

    C#简单四则运算计算器

    实现了简单四则运算器,利用C#制作计算器页面

    用8086汇编语言编写一个能实现四则混合运算

    本资源是关于使用8086汇编语言编写一个简单的计算器,实现加、减、乘、除四则运算的混合运算。该计算器需要使用汇编语言知识,包括数据存储、寄存器的使用、加减乘除相关指令、模块的调用等。 知识点一:汇编语言...

    四则混合运算表达式分析程序----C#递归分析版

    在四则混合运算表达式分析中,递归可以帮助我们逐层分解表达式,直到每个部分都变得足够简单,如单个数字或者操作符。 首先,我们需要定义一个方法,这个方法接收一个字符串形式的表达式作为输入。然后,我们会设计...

    c#简单小型四则运算计算器

    在C#编程中,开发一个简单的四则运算计算器是一个经典的初学者项目,它涉及到基本的UI设计、事件处理以及数值类型的转换。这个项目的核心在于理解如何接收用户输入、执行计算并返回结果。以下是对这个小型四则运算...

    vs2008C#写的四则混合运算的计算器

    总结来说,这个基于VS2008 C#的四则混合运算计算器展示了如何结合状态机设计、逆波兰表达式和C#编程技术来实现一个功能完备的计算器。它不仅加深了对基本运算逻辑的理解,也提供了一个实践编程技巧和算法设计的实例...

    C语言实现计算器简单混合运算

    在本项目中,"C语言实现计算器简单混合运算" 是一个使用C语言编写的程序,旨在创建一个能够处理基本数学运算的简易计算器。混合运算意味着它不仅支持加法、减法,还支持乘法和除法,甚至可以处理带有括号的运算...

    c#编写的能进行四则混合的运算器

    在这个特定的案例中,我们讨论的是一个使用C#编写的计算器程序,它具备进行四则混合运算的能力。四则运算包括加法(+)、减法(-)、乘法(×)和除法(÷),而混合运算则意味着这些操作可以按任意顺序组合,并且...

    vs2010+qt四则混合运算计算器

    【标题】"vs2010+qt四则混合运算计算器"所涉及的知识点主要集中在使用Visual Studio 2010(简称VS2010)集成开发环境和Qt库来构建一个支持优先级和括号的四则混合运算计算器应用。这个项目不仅涉及到基本的C++编程,...

    四则混合运算模块.zip易语言项目例子源码下载

    在易语言中,四则混合运算主要通过内置的数学函数和运算符实现。例如,"+"代表加法,"-"代表减法,"*"代表乘法,"/"代表除法。这些运算符可以用于整型、浮点型等不同数据类型的数值之间,形成复杂的表达式,完成多步...

    四年级数学上册7整数四则混合运算7.1.1整数四则混合运算一教学反思素材苏教版

    整数四则混合运算,作为小学数学的重要组成部分,是孩子们从简单的加减运算迈向更复杂计算的关键一步。在这个阶段,孩子们需要掌握如何正确、高效地处理含有加、减、乘、除的运算题目,这无疑对他们的逻辑思维和问题...

Global site tag (gtag.js) - Google Analytics