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

在Java中使用Scanner next()方法时获取多个字符?,java,Java,我正在尝试使用堆栈将中缀算术表达式转换为后缀表达式。我正在使用scanner.next()方法扫描字符串表达式,基本上将其拆分,并使用开关大小写块检查正在执行的操作 但是,scanner.next()方法将括号附加到任何数字上。例如,(5+5)将不会被解读为“(“5”+”等),但将被解读为“(5”+”5)”,因此“)”的大小写将被完全跳过,因为它的前面总是有一个数字。有没有办法把括号和数字分开 这是我的代码: while(in.hasNext()) { String ex

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

但是,
scanner.next()
方法将括号附加到任何数字上。例如,(5+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;
        }
    }

不要以为你得到了第一个角色;循环遍历所有字符,无论从
.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
    }
}
while(在.hasNext()中)
{
字符串expr=in.next();
对于(int i=0;i
如javadocs for java.util.Scanner中所述,您可以使用任何自定义表达式作为分隔符(空格被视为默认值,因此带括号的条目被视为一个字符串)

以下是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(); 
看这张照片。它默认跳过空格,因此您可以在任何标记(包括括号)周围强制使用空格,也可以使用另一种标记器为您返回标记


我发现学习曲线是值得的。

您可以使用下面的代码。您需要迭代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
        }
    }
}
charop;
char[]charArray;
while(在.hasNext()中){
字符串expr=in.nextLine();
System.out.println(“表达式为:“+expr+”);
charArray=expr.toCharArray();
for(int i=0;i
扫描仪很难做到这一点。您需要一些功能强大的正则表达式,幸运的是,我有正确的表达式,只需稍加修改,您的代码中的此示例就可以完美地工作:

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

            }

        }

    }
}

您的代码还创建了一个无限循环。为了保持简洁,我省略了大部分代码。这正是造成问题的原因。我刚刚给了您一个提示,如果您在console.oo中接受用户的输入,while循环将创建无限循环。我可以看出这是可行的,但我的默认情况可能会导致问题,因为如果有一个整数,例如352,它会在每个数字之间放置空格,因此看起来像3 5 2.True。任何超过1位的数字都将被拆分。另外,我的答案有点像黑客——最好的办法可能是像前面提到的其他答案一样为扫描仪设置自定义选项。或者更好的方法是,一次读取整个字符串(如果可能的话),然后像我的示例那样逐字符循环。