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编程语言和堆栈数据结构来解决迷宫问题,并创建一个具有交互界面的程序。 首先,堆栈是一种后进先出(LIFO)的数据结构,适用于处理需要回溯的问题...
出栈操作总是移除最近被压入堆栈的元素。 堆栈在许多算法和编程问题中都有应用,比如: - **函数调用**:在执行递归或函数调用时,系统会使用堆栈来保存每次调用的状态。 - **表达式求值**:后缀表达式(也称为...
否则,将操作分解为三个操作,并将其压入堆栈中。最后,使用clock函数来计算算法的执行时间。 汉诺塔算法的递归实现 汉诺塔算法的递归实现也使用了C++语言,主要包括一个solve函数,该函数用于解决汉诺塔问题。该...
在这个场景中,我们讨论的是与堆栈算法相关的知识点,特别是基于“先进后出”(Last In, First Out, 简称LIFO)原则的全局FB库文件。 堆栈是一种特殊的线性数据结构,它的主要特点就是遵循LIFO原则。在堆栈中,元素...
本篇文章将详细讲解如何使用C#的类来实现堆栈算法。 首先,创建一个名为`Stack`的类,这个类将代表我们的堆栈数据结构。在`Stack`类中,有两个私有成员变量:`count`用于记录堆栈中的元素数量,`first`表示堆栈的首...
通过阅读这份文档,可以深入理解堆栈算法在后缀表达式计算中的应用,以及如何在实际项目中实现这个功能。 总的来说,这个项目旨在锻炼和展示对数据结构(堆栈)的理解和使用,以及在Windows应用程序开发中的实践...
常见的堆栈操作有压入(Push)、弹出(Pop)、查看栈顶元素(Peek)以及检查是否为空(IsEmpty)。在VC(Visual C++)环境下,我们可以通过自定义类来实现堆栈的功能。例如,`ChanQue.h`中的`ChanQue`类可能就定义了...
Java计算器源码含界面,基于堆栈算法实现,是一份非常适合初学者进行实践与学习的项目。这个项目的核心是利用栈这种数据结构来处理复杂的计算问题,尤其对于那些涉及运算符优先级和括号的表达式。在此,我们将深入...
在这个主题中,我们将深入探讨如何使用堆栈来实现基于邻接矩阵的深度优先搜索(DFS)算法。 深度优先搜索是一种用于遍历或搜索树或图的算法,其基本思想是从起点开始,沿着某条路径一直探索到不能再深入为止,然后...
每个数字被直接压入堆栈,而每个运算符则与堆栈顶部的两个数字进行操作,并将结果压回堆栈。遇到括号时,我们会进入括号内的表达式,直到遇到对应的闭合括号,然后继续处理外部的运算。 以表达式 "2 + 3 * (4 - 5)...
### 基于堆栈的计算器实现算法 #### 概述 在计算机科学领域,堆栈(Stack)是一种特殊的线性数据结构,它遵循“后进先出”(Last In, First Out, LIFO)的原则。堆栈在计算器程序的设计中扮演着至关重要的角色,...
在这个问题中,我们将探讨如何使用C语言中的堆栈数据结构来实现LRU算法。 首先,我们需要理解堆栈的基本概念。堆栈是一种后进先出(LIFO, Last In First Out)的数据结构,类似于日常生活中的堆叠物品,最后放入的...
在本文中,我们将深入探讨如何使用C#编程语言实现迷宫算法,并重点讲解利用堆栈数据结构来解决这一问题。迷宫算法是一个经典的路径搜索问题,通常用于游戏开发、路径规划和其他需要找到从起点到终点最短路径的应用...
算法从种子点开始,首先将其上下左右四个方向的相邻像素点坐标压入堆栈。接着,从堆栈中取出一个坐标点进行检查。如果其颜色与种子点相同,则将其四个方向的相邻像素点坐标继续压入堆栈中,如此循环往复,直到堆栈为...
当我们遍历输入字符串时,每当遇到一个左括号,我们就将其压入堆栈。当遇到右括号时,我们需要检查堆栈顶部的元素是否是对应类型的左括号。如果是,我们就将这对括号视为匹配并从堆栈中弹出该左括号;如果不是,或者...
1. **压栈(push)**:当遇到左括号(如'{'、'['或'(')时,我们将它压入堆栈。 2. **弹栈(pop)**:遇到右括号时,检查堆栈是否为空以及顶部的左括号是否与当前右括号匹配。如果匹配,我们就弹出堆栈顶部的左括号...
### 基于双向堆栈的AVL树双向迭代算法详解 #### 一、引言与背景 在现代计算机科学中,数据结构的设计对于优化算法性能至关重要。平衡二叉搜索树,尤其是AVL树,因其良好的查找性能和有序的数据存储方式而被广泛...
- **探索相邻节点**:对于每个未访问的相邻节点,将其压入堆栈,并标记为已访问。 3. **结束条件**:如果找到终点,算法结束;否则,继续进行下一次循环。 在实际编程实现时,可以使用一个二维数组来表示迷宫,一...