首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >后缀calc只适用于适当的间距(即3 14 2*7/抛出异常)

后缀calc只适用于适当的间距(即3 14 2*7/抛出异常)
EN

Stack Overflow用户
提问于 2013-11-16 01:23:30
回答 3查看 423关注 0票数 0

该代码为操作发布了工作,但如果运算符和操作数之间没有间隔,则不会工作。

我得到了4个要计算的表达式

  1. 10 2 8*+3-
  2. 3 14+2*7/
  3. 4 2+3 15 1-*+
  4. 1 2+3%6-2 3+/

(间隔很重要)

表达式二是不使用当前计算器计算的表达式。

这是我的密码

代码语言:javascript
复制
  import java.util.*;
  public class PostFix {

   public static void main(String []args){

    Stack<Integer> stack = new Stack<Integer>();
    System.out.println("Input your expression using postfix notation");
    Scanner input = new Scanner(System.in);
        String expr = input.nextLine();
        StringTokenizer tokenizer = new StringTokenizer(expr);

    while(tokenizer.hasMoreTokens()){
        String c = tokenizer.nextToken();
        if(c.startsWith("0")|| c.startsWith("1")||c.startsWith("2")||c.startsWith("3")||c.startsWith("4")||
            c.startsWith("5")||c.startsWith("6")||c.startsWith("7")||c.startsWith("8")||c.startsWith("9"))
            stack.push(Integer.parseInt(c));
        else if(c.equals("+")){
            int op1 = stack.pop();
            int op2= stack.pop();
            stack.push(op2+op1);
        }
        else if(c.equals("-")){
            int op1 = stack.pop();
            int op2= stack.pop();
            stack.push(op2-op1);
        }
        else if(c.equals("*")){
            int op1 = stack.pop();
            int op2= stack.pop();
            stack.push(op2*op1);
        }
        else if(c.equals("/")){
            int op1 = stack.pop();
            int op2= stack.pop();
            stack.push(op2/op1);
        }
        else if(c.equals("%")){
            int op1 = stack.pop();
            int op2= stack.pop();
            stack.push(op1%op2);
        }



    }
System.out.println(stack.pop());

}
   }

这是StackTrace

代码语言:javascript
复制
 Input your expression using postfix notation
 3 14+2*7/
 Exception in thread "main" java.lang.NumberFormatException: For input string:  "14+2*7/"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at PostFix.main(PostFix.java:18)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-16 02:01:39

如果您真的必须使用StringTokenizer,请按如下方式构造它:

代码语言:javascript
复制
StringTokenizer tokenizer = new StringTokenizer(expr, " +-*/%", true);

第二个参数表示,除了空格之外,空格和所有运算符都被认为是分隔符。第三个参数表示分隔符被视为标记,所以当它看到"+""-"等时,它将返回为字符串。它还将返回空间,因此您必须确保当nextToken返回" "时,忽略它,而不将其视为错误。

票数 0
EN

Stack Overflow用户

发布于 2013-11-16 01:25:54

使用StreamTokenizer进行解析,请参阅http://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html

代码语言:javascript
复制
StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(expr));
tokenizer.ordinaryChar('/');  // see comments

while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){
  if (tonenizer.ttype == StreamTokenizer.TT_NUMBER) {
    stack.push(Integer.parseInt(tokenizer.sval));
  } else {
    int op1 = stack.pop();
    int op2 = stack.pop();
    switch (ttype) {
      case '+': op2 += op1; break;
      case '-': op2 -= op1; break;
      case '*': op2 *= op1; break;
      case '/': op2 /= op1; break;
    }
    stack.push(op2);
  }
}
票数 0
EN

Stack Overflow用户

发布于 2013-11-16 01:59:34

或者,如果不能使用StreamTokenizer,则使用StringTokenizer构造函数的3参数版本:

代码语言:javascript
复制
StringTokenizer tokenizer = new StringTokenizer(expr, " +*-/", true);

这将使‘’、'+‘、'*’、'-‘和'/’分隔符,并将它们报告为标记。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20013474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档