压堆栈算法

本文介绍了一种使用栈的数据结构来解析并计算数学表达式的方法。通过随机生成算术题目并求解,展示了如何处理四则运算。此外,还提供了一个实用的中文数字转换函数。
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 <= 8) {
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 - 8));
if (ret.length() != 0)
ret += num2[5];
return ret + toChineseDigit1(n.substring(len - 8));
}
}

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值