我不知道我怎么能读取一个字符数组10和10以上的数字,我正在从中缀转换为后缀,目前我能够为单位数字这样做但是当它在评估时有多位数字后缀方程这将是一个错误的答案。例如10 + 13 + 4它会给出一个错误的答案但是1 + 3 + 4这是正确的。
//class main
calcParser calc = new calcParser("13+20+3+4");
calc.toPostfix();
calc.displayPostfix();
calc.evaluatePostfix();
calc.displayResult();
// result for above would be
1320+3+4+
9.0
// class calcParser
public void toPostfix()
{
for(char c : originalExp.toCharArray())
{
switch(c)
{
case '0': case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9':
postfixExp.append(c);
break;
case '+': case '-':
if(postfixStack.empty())
{
postfixStack.push(c);
}
else
{
if((postfixStack.peek().equals(c)))
{
postfixExp.append(postfixStack.pop());
postfixStack.push(c);
}
else
{
postfixExp.append(postfixStack.pop());
postfixStack.push(c);
}
}
break;
}
}
while(!postfixStack.empty())
{
postfixExp.append(postfixStack.pop());
}
}
public void evaluatePostfix()
{
String postfix = postfixExp.toString();
for(char c : postfix.toCharArray())
{
switch (c)
{
case '0': case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9':
postfixResultStack.push(c);
break;
case '+':
firstOperand = Double.parseDouble(postfixResultStack.pop().toString());
secondOperand = Double.parseDouble(postfixResultStack.pop().toString());
postfixResultStack.push(firstOperand + secondOperand);
break;
case '-':
firstOperand = Double.parseDouble(postfixResultStack.pop().toString());
secondOperand = Double.parseDouble(postfixResultStack.pop().toString());
postfixResultStack.push(firstOperand - secondOperand);
break;
}
}
}
答案 0 :(得分:3)
在你不断获取数字的同时进行扫描。但你必须放弃使用for(char:...)的想法。您需要一种明确推进当前位置的方法。
答案 1 :(得分:1)
如何使用StringTokenizer?使用操作数作为标记拆分字符串,然后使用Integer.parseInt()来解析数字?
好的,我想出一些解决你的功课的东西。这很难看但很有效。 :)
public static void main(String[] args) {
String expression = "10+10+2-10-1";
List<String> positiveOperands = new ArrayList<String>();
StringTokenizer st = new StringTokenizer(expression, "+");
while(st.hasMoreElements()){
positiveOperands.add(st.nextToken());
}
int total = 0;
for(String posOperand: positiveOperands){
// evaluate subtraction
StringTokenizer st2 = new StringTokenizer(posOperand, "-");
int a = 0;
if(st2.hasMoreElements()) a = Integer.parseInt(st2.nextToken());
while(st2.hasMoreElements()){
a-=Integer.parseInt(st2.nextToken());
}
total+=a;
}
System.out.println(total);
}
答案 2 :(得分:1)
以下是使用java.util.Scanner
的解决方案:
Scanner sc = new Scanner("12+3 - 456").useDelimiter("\\b");
while (sc.hasNext()) {
if (sc.hasNextInt()) {
int num = sc.nextInt();
System.out.printf("Got an int [%s]%n", num);
} else {
String op = sc.next().trim();
System.out.printf("Got an op [%s]%n", op);
}
}
以上打印(as seen on ideone.com):
Got an int [12]
Got an op [+]
Got an int [3]
Got an op [-]
Got an int [456]
分隔符是\b
(Java字符串文字中的反斜杠加倍),这是“单词边界”。除其他地方外,它出现在单词字符\w
(数字为)和非单词字符\W
(运算符为)之间。
作为警告,此分隔符正则表达式不会正确地标记带小数点的浮点数,但可以编写更具体的正则表达式来解决这些问题(如果需要)。
还请注意使用Scanner
将String
解析为int
的便利性;你可以这样做,它永远不会抛出异常(例如首先断言它hasNextInt()
)。
Scanner
教程答案 3 :(得分:0)
您可能希望使用令牌而不是字符。
让解析器的第一阶段使用char流并生成Tokens流,然后让下一个阶段生成/执行堆栈。
所以你有:
“10 + 11 + 4”变为
列出{Number(10),Operator(+),Number(11),Operator(+),Number(4)}
然后使用现有的toPostFix()(修改为在令牌上工作)构建堆栈,然后打印/评估/等。
要生成令牌,传统方法是按顺序应用一系列正则表达式,第一个匹配用于生成令牌。