在Java中使用Scanner next()方法时获取多个字符?

时间:2015-01-22 05:02:13

标签: java

我正在尝试使用堆栈将中缀算术表达式转换为后缀表达式。我正在使用scanner.next()方法扫描字符串表达式并基本上将其拆分并使用switch-case块来检查正在执行的操作。

但是,scanner.next()方法会将括号附加到任何数字。例如,(5 + 5)不会被读作'(''''''+'等但会被读作“(5”“+”“5”)所以')'的情况是被完全跳过,因为前面总是有一个数字。有没有办法可以将括号与数字分开?

这是我的代码:

while(in.hasNext())
    {
        String expr = in.next();
        op = expr.charAt(0);

        //testing the ops
        System.out.println("OP IS: "+ expr + " ");

        switch(expr)
        {
            case "+":
            case "-":
                while(!stack.isEmpty() && !stack.peek().equals("("))
                {
                    postfixStr = postfixStr.concat("" + stack.pop() + " ");
                }
                stack.push(expr);
                break;

            case "*":
            case "/":
                while(!stack.isEmpty() && !stack.peek().equals("(") && !stack.peek().equals("+") && !stack.peek().equals("-"))
                {
                    postfixStr = postfixStr.concat("" + stack.pop() + " ");
                }
                stack.push(expr);
                break;

            case "(":
                stack.push(expr);
                System.out.println("IT HAS BEEN PUSHED");
                break;

            case ")":
                System.out.println("TEST POINT 1");
                String peekOp = stack.peek();
                while(!stack.isEmpty() && !peekOp.equals("("))
                {
                    postfixStr = postfixStr.concat("" + stack.pop() + " ");
                    System.out.println("%%%%" + peekOp);
                    peekOp = stack.peek();

                }
                System.out.println("TEST POINT 2");
                stack.pop();

                break;

            default:
                postfixStr = postfixStr.concat("" + expr + " ");
                break;
        }
    }

5 个答案:

答案 0 :(得分:0)

不要只是假设你获得了第一个角色;循环遍历所有角色,无论你从.next()得到多少。试试这个:

while(in.hasNext())
{
    String expr = in.next();

    for (int i = 0; i < expr.length(); i++){
        char op = expr.charAt(i); 

        // ... the rest of your code here
    }
}

答案 1 :(得分:0)

http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html中java.util.Scanner的javadocs所述,您可以使用任何自定义表达式作为分隔符,(空格被视为默认值,因此带括号的条目被视为一个字符串)。

以下是javadocs的摘录。

扫描仪还可以使用空格以外的分隔符。此示例从字符串中读取几个项目。您可以在括号中使用括号作为分隔符。

String input = "1 fish 2 fish red fish blue fish";
 Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
 System.out.println(s.nextInt());
 System.out.println(s.nextInt());
 System.out.println(s.next());
 System.out.println(s.next());
 s.close(); 

答案 2 :(得分:0)

查看Scanner Docs。它默认跳过空格,因此您可以在任何标记周围强制使用空格,包括括号,或者您可以使用另一种将为您返回标记的标记生成器。

我发现JFLex值得学习曲线。

答案 3 :(得分:0)

您可以使用以下代码。你需要迭代charArray并处理它..

char op;
char[] charArray;
while(in.hasNext()) {
    String expr = in.nextLine();
    System.out.println("Expression IS: "+ expr + " ");
    charArray = expr.toCharArray();

    for (int i = 0; i < charArray.length; i++) {
        System.out.println("OP IS: "+ charArray[i] + " ");
        switch(charArray[i]) {
            // your switch code
        }
    }
}

答案 4 :(得分:0)

扫描仪这样做很棘手。你需要一些像正则表达式一样强大的东西,幸运的是我有正确的表达方式,几乎没有任何修改,这个样本基于你的代码完美地工作:

import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.io.StringReader;

public class RegexSample {

    public static void main(String[] argv) {

        char op;
        String expression = "(5+2 )/ 3 - 1 * abc123-(( (123/ 123) )-1) - 1 + 2";

        // equivalent to the regular expression \+|\-\*|\/|\(|\)|\w
        // that accepts + , - , * , / , 
        Pattern p = Pattern.compile("\\+|\\-|\\*|\\/|\\(|\\)|\\w+");
        Matcher m = p.matcher(expression);

        System.out.println("start - " + expression);


        while ( m.find() ) {
            String expr = m.group();
            op = expr.charAt(0);

            //testing the ops
            System.out.println("OP IS: " + expr + " ");


            switch (expr) {
                // your switch code

            }

        }

    }
}