四则运算计速器算法

原创 2015年11月17日 17:20:32

//用双栈模拟 有点low
public class MyStack{
private int top=-1; //模拟栈底,指向-1
private int maxSize=15; //模拟栈的容量为5
private String[] stack=new String [100];//用来数组来模拟,想数组 内填入栈的内容
// private char a=1.2;
//判断是否是运算符
public boolean isOper(char ch){
if(ch==’+’||ch==’-‘||ch==’*’||ch==’/’){
return true;
}else{
return false;
}
}
//判断栈是否为空
public boolean isEmpty(){
if(this.top==-1){
return true;
}else{
return false;
}
}
//判断符号的优先级
public int PRI(char ch){
if(ch==’*’||ch==’/’){
return 1;
}else if(ch==’+’||ch==’-‘){
return 0;
}
return -1;
}
//获得栈顶的值
public String getTop(){
return this.stack[this.top];
}
//计算数值
public int getResult(int num1,int num2,char ope){
int res=0;
switch(ope){
case ‘+’:
res=num1+num2;
break;
case ‘-‘:
res=num2-num1;
break;
case ‘*’:
res=num1*num2;
break;
case ‘/’:
res=num2/num1;
break;
//erqiqu huibohuayuan 155171111 86
}
return res;
}
//入栈操作
public void push(String val){
///先判断栈是否已满
if(this.top==this.maxSize-1){
// echo ‘栈满,不能添加‘;
return; //栈满 返回
}
//先top上移,然后填充栈内容
this.top++;
this.stack[this.top]=val;
}
//出栈
public String pop(){
if(this.top==-1){
// echo ‘栈111空‘;
return null; //空栈,无数据,返回
}
//取出栈顶的数据,同时把该数据返回,别忘了把top指针下移
String topValue=this.stack[this.top];
this.top–;
return topValue;
}
//显示栈的所有信息
public void showStack(){
if(this.top==-1){
// echo ‘栈空!‘;
return;//空栈,无数据,返回
}
//结合堆栈的数据结构,是后进先出类型的,因此从栈顶开始,依次往下读出栈的内容
//for(i=this.top;i>-1;i–){
//echo ‘Stack[‘.i.’]=’.this.stack[i].’‘;
// }
}
}

 //测试
public class Test {
public static void main(String[] args) {

    String exp = "-3*9-2-1";
    MyStack numStack = new MyStack();
    MyStack opeStack = new MyStack();

    int index = 0;
    String keepNum = "";
    while (true) {
        String ch = exp.substring(index, index + 1);
        // ch=substr(exp,index,1);
        // 判断是否是字符
        if (opeStack.isOper(ch.charAt(0))) {
            // 是运算符
            // 是运算符
            /**
             * 3.如果发现是运算符 3.1 如果符号栈为空,就直接入符号栈
             * 
             * 3.2. 如何符号栈,不为空,就判断
             * 如果当前运算符的优先级小于等于符号栈顶的这个运算符的优先级,就计算,并把计算结果入数栈.然后把当前符号入栈 3.3
             * 如何符号栈,不为空,就判断 如果当前运算符的优先级大于符号栈顶的这个运算符的优先级,就入栈.
             * 
             */
            // 如何符号栈,不为空,
            // 如何符号栈,不为空,
            if (opeStack.isEmpty() == true) {

                if ("-".equals(ch)) {// 解决第一字符时操作符‘-’的问题
                    numStack.push("0");
                    opeStack.push(ch);
                } else {

                    opeStack.push(ch);
                }

            } else {
                // 解决当符号位的优先级最终一致时 比如:3-4*6-2。第二个‘-’能先在3*5 计算完毕之后入栈
                while (!opeStack.isEmpty()
                        && opeStack.PRI(ch.charAt(0)) <= opeStack.PRI(opeStack.getTop().charAt(0))) {

                    int num1 = Integer.parseInt(numStack.pop());
                    int num2 = Integer.parseInt(numStack.pop());
                    String ope = opeStack.pop();
                    int res = opeStack.getResult(num1, num2, ope.charAt(0));
                    numStack.push(res + "");

                }
                opeStack.push(ch);

            } // if结束
        } else {
            keepNum += ch;// 解决数字是多位数的问题
            // 先判断是否到最后,如果到最后就入栈
            if (index == exp.length() - 1) {
                numStack.push(keepNum);
            } else {

                if (opeStack.isOper(exp.substring(index + 1, index + 2).charAt(0))) {
                    numStack.push(keepNum);
                    keepNum = "";
                }
            }

        }

        ++index;
        if (index == exp.length()) {
            break;

        }

    }

    while (!opeStack.isEmpty()) {

        int num1 = Integer.parseInt(numStack.pop());
        int num2 = Integer.parseInt(numStack.pop());
        String ope = opeStack.pop();
        int res = opeStack.getResult(num1, num2, ope.charAt(0));
        numStack.push(res + "");
    }
    System.out.println(numStack.getTop());
}

}

版权声明:

linux 入门学习命令速记

1·目录   / 为根目录(linux 不分盘 特别注意 )   Bin/sbin  目录下为一些可执行性文件或者软件。   一般编辑在home 文件夹中,   http://man.linu...
  • Chelydra
  • Chelydra
  • 2017年04月29日 23:43
  • 326

# Pedometer 计步器算法简介

Pedometer 计步器算法简介以Android 6.0 M 为例,它为Pedometer计步器(以下简称Pedo)提供了两颗虚拟传感器(以下用sensor):Step Counter和Step D...
  • sslive
  • sslive
  • 2016年01月17日 15:15
  • 2754

阿里巴巴全球速卖通(AliExpress)参数签名算法

签名规则如图所示: 规则参考链接:http://gw.api.alibaba.com/dev/doc/intl/sys_signature.htm?ns=aliexpress.open 下面是...
  • sunnyzyq
  • sunnyzyq
  • 2017年04月24日 13:52
  • 412

一种基于陀螺仪传感器的准确计步器算法

一种基于陀螺仪传感器的准确计步器算法  A Gyroscope Based Accurate Pedometer Algorithm 作者:一种基于陀螺仪传感器的准确计步器算法 A Gyr...
  • lean_siege_lion
  • lean_siege_lion
  • 2014年10月14日 22:42
  • 7934

用java实现简单四则运算的算法

实现的功能例如:(12*3/-2)*(3+5)/2 = -72 应用场景:在计算器中输入一大串四则运算表达式,如何按下‘=’号,得出对应的正确结果,今天就来完成该功能的实现。思路分析首先拿到一个表...
  • HeadingAlong
  • HeadingAlong
  • 2017年01月29日 13:56
  • 2901

编译原理---四则运算表达式的计算简单实现

编译原理---四则运算表达式的计算简单实现
  • u010251278
  • u010251278
  • 2016年09月05日 19:17
  • 3436

腾讯欢乐斗地主辅助程序V1.0,PYTHON实现

闲来无事写了这个玩意.深感PYTHON
  • napo1987
  • napo1987
  • 2014年06月04日 18:17
  • 882

表达式(四则运算)计算的算法

表达式(四则运算)计算的算法戏剧前奏——基本知识点通常我们所看到的算术表达式,运算符总是在两个操作数中间(除),如(A+B)*C,这样的表达式叫做中缀表达式。这种表达式不同的运算符优先级不同,而且通常...
  • luoweifu
  • luoweifu
  • 2013年08月29日 00:24
  • 15199

qt用设计器实现简单四则运算计算器

////dialog.h #ifndef DIALOG_H #define DIALOG_H #include #include namespace Ui { class Dialog; }...
  • LDZ1943
  • LDZ1943
  • 2014年11月06日 14:11
  • 1924

编程题:四则运算

题目描述 请实现如下接口     /* 功能:四则运算      * 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]...
  • crystal_melody
  • crystal_melody
  • 2016年08月26日 16:24
  • 846
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:四则运算计速器算法
举报原因:
原因补充:

(最多只允许输入30个字)