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();
}
}
分享到:
相关推荐
一个用vs03写的简单计算器,能够实现加减乘除混合运算。
给出四则混合运算的详细实现,代码较为全面给出了包括错误检查等各个发面的问题
一个用汇编语言程序设计的计算器,可以实现四则混合运算。
简单的计算器 用c#写的 实现了简单的混合运算
采用编译原理的方法用c语言实现四则混合运算,其中有词法分析和语法分析,并用尾动作文法实现求值。请先看action表和goto表,一定要对照着这两个表来看程序。
实现了简单四则运算器,利用C#制作计算器页面
这是用c#win应用窗体编译出来的小型四则运算计算器,虽然很简单,但是对于理解字符型转换为数值型和数值型转换为字符型我觉得蛮有帮助的,本人为初学者,请大家多多包涵。谢谢
自己用Qt实现了一个简单的计算器,可以给有需要的朋友参考下。开发环境是Qt4.8.6+Qt Creator3.2.0,里面包含了源码和打包好的工具。本人水平有限,请高手飘过,如有问题请指教。谢谢!
C++编写一个计算器,实现加减乘除,并且实现简单的混合运算(不包括括号运算)
C语言实现计算器简单混合运算 博客地址:https://blog.csdn.net/XiaoCaiDaYong/article/details/131786947
C#窗体程序—计算器(能实现四则混合运算)-附件资源
利用堆栈实现简单四则运算。包括了加减乘除,括号,优先级等运算。能够实现大数的运算。
Android Calculte With Bundles without activities
1. 能够完成加减乘除四则运算(整数、小数) 2. 具备清空、退格功能 一、 拓展功能: 1. 能够记录计算的历史记录 2. 正负号功能 3. 支持带括号的运算 4. 平方根,立方根,任意次方根 5. 平方、立方、任意次方 6. ...
实现简单混合运算不按等号且包括开方,误操作报错功能。
初学者一看就懂,本人的第一个小程序,全部是最简单的控件生成.
小学生四则运算实现,c语言编写。 实现小学生加法、减法、乘法和除法运算。 并选择难易度,简单运算和混合运算,具有界面选择功能。
简单的JAVA计算器,能进行四则运算,有 括号,加了栈!
一个简单的计算器,能够实现加减乘除以及括号的四则混合运算功能
利用运算符优先关系,实现对算术四则混合运算表达式的求值。 【测试数据】 (1)能够判断表达式中的括号是否匹配,测试的表达式中括号不匹配,可以重新输入。 (2)能够处理多位整数以及浮点数。 (3)具体测试数据...