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. 字符串栈 定义了一个名为...
在本文中,我们将深入探讨如何使用C#编程语言在Visual Studio 2003 (VS03)环境下创建一个简单的计算器程序,该程序能够执行基本的加法、减法、乘法以及除法的混合运算。这个项目对于初学者来说是很好的实践,因为它...
本教程将聚焦于一个针对C语言初学者的简单但实用的程序——四则混合运算程序。这个程序允许用户进行加、减、乘、除的混合计算,是学习C语言控制流程、变量、数据类型和函数的好实践。 首先,让我们理解四则运算的...
该程序通过简单的布局和事件监听实现了基本的四则混合运算计算器功能。虽然代码结构较为基础,但很好地展示了Swing组件的基本用法和事件驱动编程的思想。此外,通过增加更多复杂的功能(如括号支持、更复杂的数学...
在C#中,实现四则混合运算通常需要理解算法和数据结构,特别是二叉树和栈的概念。下面将详细阐述如何使用C#来实现这一功能。 首先,四则混合运算是基于算术运算符的优先级进行的,例如乘法和除法的优先级高于加法和...
在本项目“编译原理课程设计_四则混合运算_C语言”中,我们将探讨如何运用编译原理的基本概念,特别是SLR(简单左递归)文法和尾动作文法,来实现C语言中的四则混合运算。这个设计任务旨在帮助学生深入理解编译器的...
4. **条件判断**:为了实现混合运算,程序需要检查当前的操作符,这通常通过`CMP`指令比较寄存器或内存中的值来实现,然后根据比较结果跳转到相应的代码段执行下一步操作。 5. **循环控制**:对于复杂的表达式,...
在本文中,我们将深入探讨如何使用C#编程语言构建一个简单的计算器,该计算器能够执行基本的混合运算。C#是一种面向对象的、类型安全的、现代的编程语言,由微软公司开发,广泛应用于Windows应用程序、游戏开发、...
在本项目中,"Java综合程序设计——计算器(实现运算符优先级的四则混合运算)"是一个典型的软件开发任务,旨在实现一个功能丰富的计算器,包括基础的四则运算以及更复杂的数学操作如对数和平方根。这个计算器的关键...
实现了简单四则运算器,利用C#制作计算器页面
在四则混合运算表达式分析中,递归可以帮助我们逐层分解表达式,直到每个部分都变得足够简单,如单个数字或者操作符。 首先,我们需要定义一个方法,这个方法接收一个字符串形式的表达式作为输入。然后,我们会设计...
在C#编程中,开发一个简单的四则运算计算器是一个经典的初学者项目,它涉及到基本的UI设计、事件处理以及数值类型的转换。这个项目的核心在于理解如何接收用户输入、执行计算并返回结果。以下是对这个小型四则运算...
总结来说,这个基于VS2008 C#的四则混合运算计算器展示了如何结合状态机设计、逆波兰表达式和C#编程技术来实现一个功能完备的计算器。它不仅加深了对基本运算逻辑的理解,也提供了一个实践编程技巧和算法设计的实例...
在本项目中,"C语言实现计算器简单混合运算" 是一个使用C语言编写的程序,旨在创建一个能够处理基本数学运算的简易计算器。混合运算意味着它不仅支持加法、减法,还支持乘法和除法,甚至可以处理带有括号的运算...
在这个特定的案例中,我们讨论的是一个使用C#编写的计算器程序,它具备进行四则混合运算的能力。四则运算包括加法(+)、减法(-)、乘法(×)和除法(÷),而混合运算则意味着这些操作可以按任意顺序组合,并且...
【标题】"vs2010+qt四则混合运算计算器"所涉及的知识点主要集中在使用Visual Studio 2010(简称VS2010)集成开发环境和Qt库来构建一个支持优先级和括号的四则混合运算计算器应用。这个项目不仅涉及到基本的C++编程,...
在易语言中,四则混合运算主要通过内置的数学函数和运算符实现。例如,"+"代表加法,"-"代表减法,"*"代表乘法,"/"代表除法。这些运算符可以用于整型、浮点型等不同数据类型的数值之间,形成复杂的表达式,完成多步...
整数四则混合运算,作为小学数学的重要组成部分,是孩子们从简单的加减运算迈向更复杂计算的关键一步。在这个阶段,孩子们需要掌握如何正确、高效地处理含有加、减、乘、除的运算题目,这无疑对他们的逻辑思维和问题...