我正在尝试使用堆栈将中缀算术表达式转换为后缀表达式。我正在使用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;
}
}
答案 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
}
}
}
}