`
sammyfun
  • 浏览: 1163494 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

压堆栈算法

 
阅读更多
import java.util.Deque;
import java.util.LinkedList;
import java.util.Random;

public class MathTest {
private static char[] operations = { '+', '-', '*', '/' };
private static final int NUMBER = 10;


/**
  * 我写的  不是道是否是你需要的答案
  *
  *
  * 用getQgetQuestion()方法 可以获得一个随机的问题
  *
  * 用getAnswer(String question)方法 可以解答获得的问题
  *
  * 当然 你可以直接调用getgetAnswer 方法,传你指定的 问题进去,然后得到结果
  *
  * 如果 你不行要 随机产生问题的代码
  *
  * 发信息 给我,我帮你删除了
  *
  * 你直接调用getAnswer 传参数就可以得到答案了
  *
  *
  *解决 这个问题的 方法 主要是  利用栈!
  *写了一些 注释,再详细的 注释....
  *
  *建议 理解栈的原理后再 详细的代码
  *
  *如果只想用  那 直接引用吧
  * @param args
  */
public static void main(String[] args) {
 
  /**
   * 测试你给出的的问题:
   */
  MathTest mt=new MathTest();
  String yourAnswer=mt.getAnswer("3*4+6/2-1");
  System.out.println("问题的答案是:"+yourAnswer);
 

  /**
   * 下面是我的 随机产生问题,并且解答该问题,
   */
  System.out.println();
  for (int i = 1; i < 11; i++) {
   String question = mt.getQuestion();
   //  String question="3*4+6/2-1";
   System.out.println("随机问题:"+i+"\t" + question+" =?");
   System.out.println("答案:" + mt.getAnswer(question));
   System.out.println("--------------------------------------");
  }

}







private static boolean check(double rightAnswer, double result) {
  boolean rs=Math.abs((rightAnswer-result))<1e-6;
  return rs;
}

/**
  * 生成问题
  * @return
  */
public static String getQuestion() {
  StringBuilder sb = new StringBuilder(); // 非线程安全类,效率更高
  Random r = new Random();
  sb.append(r.nextInt(NUMBER) + 1);
  for (int i = 0; i < operations.length; i++) {
   sb.append(operations[r.nextInt(operations.length)]);
   sb.append(r.nextInt(NUMBER) + 1);
  }
  return sb.toString();
}

public String getAnswer(String question){
  return String.valueOf(calculate(question));
}

/**
  * 解答问题 7+4-3*4/2
  *
  * 以下  是解答问题的 详细代码
  * @param question
  * @return
  */
private static double calculate(String question) {
 
  char[] chars = question.toCharArray();
  StringBuilder sb = new StringBuilder();
  String[] strs = new String[9];
//  String[] strs = new String[chars.length];
  int index = 0;
  for (char c : chars) {
   boolean flag = false;
   for (char o : operations) {
    if (c == o) {
     flag = true;
     break;
    }
   }

   if (flag) {
    // 是操作符
    String num = sb.toString();
    sb.delete(0, sb.length());
    strs[index++] = num;
    strs[index++] = String.valueOf(c);
   } else {
    sb.append(c);
   }
  }
  strs[index] = sb.toString();
  /**
   * 以上是将字符串 转换为 String数组 
   *
   */
  double result = calcu(strs);
  return result;
}

private static double calcu(String[] strs) {
  /**
   * 定义 两个栈 
   * 计算的过程  就是在两个栈 中来回 捣腾  数据
   */
  Deque<String> stack = new LinkedList<String>();
  Deque<String> temp = new LinkedList<String>();
 
  /**
   * 将 说有的数据放到 一个栈中
   */
  for (int i = strs.length - 1; i >= 0; i--) {
   stack.push(strs[i]);
  }

  /**
   * 捣腾数据 先 计算 *  / (乘除)
   */
  while (!stack.isEmpty()) {
   String value = stack.poll();
   if ("*".equals(value) || "/".equals(value)) {
    double privew = Double.parseDouble(temp.poll());
    double next = Double.parseDouble(stack.poll());
    double result = 0.0;
    if ("*".equals(value)) {
     result = privew * next;
    } else if ("/".equals(value)) {
     result = privew * 1.0 / next;
    }
    temp.push(""+result);  
   } else {
    temp.push(value);
   }
  }
  stack.clear();
//  System.out.println("TEMP:" + temp.toString());
 
  /**
   * 计算完 乘除后  数据都到了  另外一个 栈中
   *
   * 此时  再 把数据 捣腾回来(我试过 ,不用捣腾回来 也是可以的,当时,捣腾回来,计算更清晰)
   */
  while (!temp.isEmpty()) {
   stack.push(temp.poll());
  }

//  System.out.println("ST:" + stack.toString());
 
  String priview="";
  /**
   * 计算  完 乘除
   * 就只剩下加减运算了
   *  这里可以打印 看看 System.out.println("ST:" + stack.toString());
   */
  while(!stack.isEmpty()){
   String value=stack.poll();
   if("+".equals(value) || "-".equals(value)){
    String next=stack.poll();
    double result=0.0;
    if("+".equals(value)){
     result=Double.parseDouble(priview)+Double.parseDouble(next);
    }else if("-".equals(value)){
     result=Double.parseDouble(priview)-Double.parseDouble(next);
    }
    priview=""+result;
   }else{
    priview=value;
   }
  }
 
  /**
   * 最后的 preivew的值就是  结果
   *
   */
//  System.out.println("A:"+priview);
  return Double.parseDouble(priview);
}



}



public class MoneyConvert {
public static String toChineseDigit1(String n) { 
        String num1[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆","柒","捌","玖",}; 
        String num2[] = {"", "拾", "佰", "仟", "万", "亿", "兆", "吉", "太", "拍", "艾"}; 
        int len = n.length(); 
         
        if (len <= 5) { 
            String ret = ""; 
            for (int i = 0; i < len; ++i) { 
                if (n.charAt(i) == '0') { 
                    int j = i + 1; 
                    while (j < len && n.charAt(j) == '0') ++j; 
                    if (j < len) 
                        ret += "零"; 
                    i = j - 1; 
                } else 
                    ret = ret + num1[n.substring(i, i + 1).charAt(0) - '0'] + num2[len - i - 1]; 
            } 
            return ret; 
        } else if (len <=
            String ret = toChineseDigit1(n.substring(0, len - 4)); 
            if (ret.length() != 0) 
                ret += num2[4]; 
            return ret + toChineseDigit1(n.substring(len - 4)); 
        } else { 
            String ret = toChineseDigit1(n.substring(0, len -); 
            if (ret.length() != 0) 
                ret += num2[5]; 
            return ret + toChineseDigit1(n.substring(len -); 
        } 
    } 

public static void main(String[] args) {
//MoneyConvert mc = new MoneyConvert();
System.out.println(MoneyConvert.toChineseDigit1("1534222231156532"));
}

}















分享到:
评论

相关推荐

    堆栈算法的JAVA迷宫

    在这个“堆栈算法的JAVA迷宫”项目中,我们将深入探讨如何利用Java编程语言和堆栈数据结构来解决迷宫问题,并创建一个具有交互界面的程序。 首先,堆栈是一种后进先出(LIFO)的数据结构,适用于处理需要回溯的问题...

    数据结构堆栈算法的实现

    出栈操作总是移除最近被压入堆栈的元素。 堆栈在许多算法和编程问题中都有应用,比如: - **函数调用**:在执行递归或函数调用时,系统会使用堆栈来保存每次调用的状态。 - **表达式求值**:后缀表达式(也称为...

    汉诺塔堆栈算法.docx

    否则,将操作分解为三个操作,并将其压入堆栈中。最后,使用clock函数来计算算法的执行时间。 汉诺塔算法的递归实现 汉诺塔算法的递归实现也使用了C++语言,主要包括一个solve函数,该函数用于解决汉诺塔问题。该...

    TIA博途堆栈算法-先进后出LIFO全局FB库文件-GF-stack-LIFO.zip

    在这个场景中,我们讨论的是与堆栈算法相关的知识点,特别是基于“先进后出”(Last In, First Out, 简称LIFO)原则的全局FB库文件。 堆栈是一种特殊的线性数据结构,它的主要特点就是遵循LIFO原则。在堆栈中,元素...

    用C#的类实现数据结构的堆栈算法

    本篇文章将详细讲解如何使用C#的类来实现堆栈算法。 首先,创建一个名为`Stack`的类,这个类将代表我们的堆栈数据结构。在`Stack`类中,有两个私有成员变量:`count`用于记录堆栈中的元素数量,`first`表示堆栈的首...

    堆栈实现后缀表达式算法

    通过阅读这份文档,可以深入理解堆栈算法在后缀表达式计算中的应用,以及如何在实际项目中实现这个功能。 总的来说,这个项目旨在锻炼和展示对数据结构(堆栈)的理解和使用,以及在Windows应用程序开发中的实践...

    好用的VC队列与堆栈算法类

    常见的堆栈操作有压入(Push)、弹出(Pop)、查看栈顶元素(Peek)以及检查是否为空(IsEmpty)。在VC(Visual C++)环境下,我们可以通过自定义类来实现堆栈的功能。例如,`ChanQue.h`中的`ChanQue`类可能就定义了...

    Java计算器源码含界面(基于堆栈算法实现)

    Java计算器源码含界面,基于堆栈算法实现,是一份非常适合初学者进行实践与学习的项目。这个项目的核心是利用栈这种数据结构来处理复杂的计算问题,尤其对于那些涉及运算符优先级和括号的表达式。在此,我们将深入...

    邻接矩阵表示图的深度优先算法-堆栈实现

    在这个主题中,我们将深入探讨如何使用堆栈来实现基于邻接矩阵的深度优先搜索(DFS)算法。 深度优先搜索是一种用于遍历或搜索树或图的算法,其基本思想是从起点开始,沿着某条路径一直探索到不能再深入为止,然后...

    堆栈计算器,支持各级运算,采用边计算边压栈的算法

    每个数字被直接压入堆栈,而每个运算符则与堆栈顶部的两个数字进行操作,并将结果压回堆栈。遇到括号时,我们会进入括号内的表达式,直到遇到对应的闭合括号,然后继续处理外部的运算。 以表达式 "2 + 3 * (4 - 5)...

    基于堆栈的计算器实现算法

    ### 基于堆栈的计算器实现算法 #### 概述 在计算机科学领域,堆栈(Stack)是一种特殊的线性数据结构,它遵循“后进先出”(Last In, First Out, LIFO)的原则。堆栈在计算器程序的设计中扮演着至关重要的角色,...

    用C语言的堆栈实现LRU算法

    在这个问题中,我们将探讨如何使用C语言中的堆栈数据结构来实现LRU算法。 首先,我们需要理解堆栈的基本概念。堆栈是一种后进先出(LIFO, Last In First Out)的数据结构,类似于日常生活中的堆叠物品,最后放入的...

    C#实现迷宫算法(使用堆栈)

    在本文中,我们将深入探讨如何使用C#编程语言实现迷宫算法,并重点讲解利用堆栈数据结构来解决这一问题。迷宫算法是一个经典的路径搜索问题,通常用于游戏开发、路径规划和其他需要找到从起点到终点最短路径的应用...

    矩形填充算法 利用了堆栈

    算法从种子点开始,首先将其上下左右四个方向的相邻像素点坐标压入堆栈。接着,从堆栈中取出一个坐标点进行检查。如果其颜色与种子点相同,则将其四个方向的相邻像素点坐标继续压入堆栈中,如此循环往复,直到堆栈为...

    数据结构与算法——堆栈实现括号匹配

    当我们遍历输入字符串时,每当遇到一个左括号,我们就将其压入堆栈。当遇到右括号时,我们需要检查堆栈顶部的元素是否是对应类型的左括号。如果是,我们就将这对括号视为匹配并从堆栈中弹出该左括号;如果不是,或者...

    C++写括号匹配堆栈

    1. **压栈(push)**:当遇到左括号(如'{'、'['或'(')时,我们将它压入堆栈。 2. **弹栈(pop)**:遇到右括号时,检查堆栈是否为空以及顶部的左括号是否与当前右括号匹配。如果匹配,我们就弹出堆栈顶部的左括号...

    基于双向堆栈的avl树双向迭代算法

    ### 基于双向堆栈的AVL树双向迭代算法详解 #### 一、引言与背景 在现代计算机科学中,数据结构的设计对于优化算法性能至关重要。平衡二叉搜索树,尤其是AVL树,因其良好的查找性能和有序的数据存储方式而被广泛...

    利用堆栈方法解决迷宫问题

    - **探索相邻节点**:对于每个未访问的相邻节点,将其压入堆栈,并标记为已访问。 3. **结束条件**:如果找到终点,算法结束;否则,继续进行下一次循环。 在实际编程实现时,可以使用一个二维数组来表示迷宫,一...

Global site tag (gtag.js) - Google Analytics