package cn.itcast.算法;
import java.util.Deque;
import java.util.LinkedList;
// 公式 字符串 求值
/*
说明:
1. 给定的 字符串 一定 正确的
2. 不用考虑 发生 溢出的 情况
3. 如果 是 负数, 就要 用负数 括起来
*/
public class Test02 {
public static int getValue(String exp){
return value(exp.toCharArray(),0)[0];
}
public static int[] value(char[] chars,int index){
// 定义 一个 容器 保存 的 是 字符串类型
Deque<String> deque=new LinkedList<>();
int pre=0; // 用来 保存 字符串 中 的数据
int[] bra=null; // 用来 保存 有括号里面的值 和 计算到 字符串的下标
// 字符串 没到 结束 并且 没有 遇到 有括号
while (index<chars.length&& chars[index]!=')'){
// 说明 此字符 为 数字类型
// 用完 当前 字符 后 index 指针 往后 移动 一位
if(chars[index]>='0'&&chars[index]<='9'){
pre=pre*10+chars[index++]-'0';
}else if(chars[index]!='('){ // 遇到了 + - * /
// 如果 遇到到了 + - * /
// 把 数字(pre) 拿去 运算
addNum(deque,pre);
// 运算 完了之后 会把 数字 再次 放在 队列里面
// 再把 把当前的 运算符 添加到 队列中
// 用完 当前 字符后 , 将 index 指针 往后 移动一位
deque.addLast(String.valueOf(chars[index++]));
pre=0;
}else {
// 遇到了 左括号
// 如果遇到了 左括号 递归 调用 此方法
// 把 括号里面 运算完 的 结果 和 运算到 那一位的 下标 返回给我 ,
bra=value(chars,index+1);// 当前 字符 是 '(' 当然 要 取到 下一位 , 就是 跳过 左括号
pre=bra[0];
index=bra[1]+1;
}
}
// 运算这里 必然 是 遇到了 右括号
addNum(deque,pre);
return new int[]{getNum(deque),index};
}
public static void addNum(Deque<String> deque,int num) {
// 遇到了 操作符
// 它把 操作 符 的 前一个 数字 给我了
// 此时 队列 的头部 保存 的必然是 操作 符
if (!deque.isEmpty()) {
int cur = 0;
// 取出 队列 里面 的 操作符
String top = deque.pollLast();
// 判断 是 + - * / 哪一个
// 如果 是 + - 再次 添加 到 队列中
if ("+".equals(top) || "-".equals(top)) {
deque.addLast(top);
}else {
// 如果 是 * - 的 话 , 把 它们 的结果 计算出来
// 再次 入队列
// 再 把 队列 头部 的数字 取出来
cur=Integer.valueOf(deque.pollLast());
// 这里 变量 重利用了
num="*".equals(top)?(cur*num):(cur/num);
}
}
// 再把 运算好 的 结果 转化为 字符串 放入 队列中
deque.addLast(String.valueOf(num));
}
// 计算 最终 结果 此时 里面只有 + -数字
public static int getNum(Deque<String> deque){
int res=0;
boolean add=true;
String cur=null;
int num=0;
while (!deque.isEmpty()){
cur=deque.pollLast();
if(cur.equals("+")){
add=true;
}else if("-".equals(cur)){
add=false;
}else {
num =Integer.valueOf(cur);
res+=add?num:(-num);
}
}
return res;
}
public static void main(String[] args) {
String str="1+1+(3*6)+9";
int value = getValue(str);
System.out.println(value);
}
}
求表达式(java)
最新推荐文章于 2024-04-18 21:48:13 发布