2015-10-14 47 views
0

我正在研究逆向波兰记谱法程序,并且遇到了处理无效表达式的问题......如果运算符太少,我可以处理它,或者操作数,但我不能处理任何不是“(”,“+”,“ - ”,“*”和“#”)的字符。跳过行的其余部分(或强制英镑符号到输入),而不是读取整个表达如果接收到错误的字符,Java扫描仪停止读取输入

这里是下面我的代码:

public class RpnEvaluator 
{ 
    private Scanner stdin; 
    private Stack stack = new Stack(50); 
    private Queue queue = new Queue(50); 
    private String expression = ""; 
    private String interValue = ""; 
    private int numExpressions = 0; 

    /** 
    Runs the RPN Evaluator. 
    */ 
    public void run() 
    { 
     stdin = new Scanner(System.in); 
     while(stdin.hasNext()) 
     { 
     String input = stdin.next(); 
     if(input.charAt(0) == '(') 
      addOperand(input); 
     else if(input.equals("+") || input.equals("-") || input.equals("*")) 
      performOperation(input.charAt(0)); 
     else if(input.equals("#")) 
      outputExpression(); 
     else 
      invalidExpression(); **// Here is where I need to deal with anything that isn't above and output anything BEFORE the bad value, AND the value itself.** 

     } 
     System.out.println("Normal Termination of Program 3."); 
    } 

例如:输入如

(2/9) B (4/3)/# 

应该返回此输出:

Expression 1 is: (2/9)B 
Invalid Expression 
Intermediate results: 
+2

氮:不要说“磅符号”,如果你的意思是'#'(如你以前使用):作为一个英国人,否则我会认为你的意思[英镑] //www.fileformat.info/info/unicode/char/a3/index.htm)。 –

+0

保存输入信息,以便在遇到错误字符时可以打印出导致错误字符的所有内容。尝试自己填写'invalidExpression()',看看你得到了什么。 –

+0

因此,输入被自动解析为操作符或操作数,然后放入堆栈供以后使用,但我们不应该在堆栈中放置不好的令牌,我只是想知道如何处理它。 – liquidsystem

回答

0

兮兮的笔记后,我发现,我们首先介绍了逆波兰式,我们确实谈到了处理一节可能的错误,从这些笔记中,我创建了这两种方法,看起来完美无缺。

private void skipExpression() 
{ 
    while(stdin.hasNext()) 
    { 
     input = stdin.next(); 
     if(input.equals("#")) 
     break; 
    } 
} 

private void invalidExpression() 
{ 
    skipExpression(); 
    numExpressions++; 
    System.out.println("Expression " + numExpressions + " is: " + expression); 
    System.out.println("Invalid Expression"); 
    System.out.println("Intermediate results: " + interValue); 
    expression = ""; 
    interValue = ""; 
    stack.clear(); 
    queue.clear(); 
} 
0

我会与hasNext(Pattern pattern)在第一测试如果下列令牌是与具有相同特定上下文[0-9+/*\-#]或一个以上的图案有效的,并且如果不是我将跳过(模式图案)与模式匹配每字符但回车,它.确实

+0

谢谢你的回应,但是我们没有谈论过使用'.hasNext()'和任何形式的参数,下面给出的答案是这样做的,甚至如果这不是最好的解决方案。 – liquidsystem