神经彬 2017-08-04 07:46 采纳率: 0%
浏览 760

关于一个转换成后缀表达式的题,不知道为什么一直报错

package mooc.fbb;

import java.util.Scanner;
import java.util.Stack;

public class 表达式计算 {
private static Stack num = new Stack();//存后缀表达式
private static Stack sign = new Stack();//存入符号

public static void getGroup(String line){//讲字符串转换为后缀表达式
    for(int i=0; i<line.length(); i++){
        char c = line.charAt(i);
        //System.out.print((int)c+" ");
        if((int)c>=48 && (int)c<=57){//当遇到数字的时候,判断是不是多位数,然后在push进num
            int j = i+1;
            while(j<line.length() && (line.charAt(j)>=48 && line.charAt(j)<=57)){
                j++;
            }
            num.push(line.substring(i, j));
            i = j-1;
        }else if(c == '('){//遇到左括号直接存进num
            sign.push(String.valueOf(c));
        }else if(c == ')'){//遇到右括号从sign中pop栈顶元素push到num知道遇到'(',然后再pop掉'('
            while(!sign.peek().equals("(")){
                num.push(sign.pop());
            }
            sign.pop();
        }else{
            int n = 0;
            if(!sign.empty()){//如果sign中没有元素,直接令n = 0
                n = getNum(sign.peek().charAt(0));
            }
            //System.out.print(n+" ");
            int m = getNum(c);
            //System.out.println(m);
            if(m >= n){//如果当前元素的运算级别比栈顶元素运算级别要高,就直接push进sign
                sign.push(String.valueOf(c));
            }else{
                while(m < n){//如果当前运算运算级别比sign栈顶元素运算级别要低,就将sign栈顶元素pop并且push进num,知道不符合条件
                    //System.out.println(sign.pop());
                    num.push(sign.pop());//输入例子2*3+6/3的时候,这里一直报错
                    if(!sign.empty()){
                        n = getNum(sign.peek().charAt(0));
                    }
                }
            }
            //System.out.println(sign);
        }
    }
    while(!sign.empty()){
        num.push(sign.pop());
    }
}

private static int getNum(char c){
    int n = 0;
    switch(c){
        case '+':
        case '-':
            n = 1;
            break;
        case '*':
        case '/':
            n = 2;
            break;
    }
    return n;
}
/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner sc = new Scanner(System.in);
    String line = sc.nextLine();
    getGroup(line);
    System.out.println(num);
    //char[] exp = getGroup(line);//讲字符串转换为后缀表达式
}

}


  • 写回答

3条回答 默认 最新

  • 砸死接触 2017-08-04 08:37
    关注

    复制你的代码,运行没有报错!!

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器