当我只连续输入1或2个整数时,我的程序正常工作,例如:+ 13 24或* 4 - 165 235.但如果我输入%* 5 12 8,它就不能给我正确的答案。如何在一行中存在更长的整数字符串时更改循环以使其有效。给定操作的顺序和前缀表示法的格式? *我的堆栈类及其方法可以正常工作。
import java.util.*;
public class part1Main {
public static void main(String[] args) {
// Reference variables
String temp2;
int num, num1, num2, ch;
char op;
@SuppressWarnings("resource")
Scanner keyboard = new Scanner(System.in);
PrefixStack<Character> operands = new PrefixStack<Character>();
PrefixStack<Integer> S = new PrefixStack<Integer>();
System.out.print("Do you want to perform a prefix operation?");
System.out.print(" 1 for yes or 0 to quit: ");
ch = keyboard.nextInt();
temp2 = keyboard.nextLine();
while(ch != 0){
System.out.print('\n'+ "Enter the operation with a space between "
+ "each character. End your operation with a period: ");
while(keyboard.hasNext()){
if (keyboard.hasNextInt()){
num = keyboard.nextInt();
S.push(num);}
else{
temp2 = keyboard.next();
switch(temp2.charAt(0)){
case '+': operands.push('+');
break;
case '-': operands.push('-');
break;
case '/': operands.push('/');
break;
case '*': operands.push('*');
break;
case '%': operands.push('%');
break;
}
}
if(temp2.charAt(0) == '.')
break;
}
while(S.size > 1){
op = operands.pop();
num2 = S.pop();
num1 = S.pop();
switch(op){
case '+': S.push(num1 + num2);;
break;
case '-': S.push(num1 - num2);;
break;
case '/': S.push(num1 / num2);;
break;
case '*': S.push(num1 * num2);;
break;
case '%': S.push(num1 % num2);
break;
}
}
System.out.println("Your operation = " + S.pop());
System.out.print('\n'+"Do you want to perform another operation?");
System.out.print(" 1 for yes or 0 to quit: ");
ch = keyboard.nextInt();
}
}
}
答案 0 :(得分:1)
您使用的算法是错误的!
例如,假设您给出:
% * 5 12 8
您的程序将输出5
作为答案
它将在堆栈上推送%和*,在堆栈上推送5 12和8
然后它将取出8和12并取出*并执行8 * 12 = 96
并将其推入堆栈
现在在下一轮中它将取出96和5以及%作为运算符并执行5 % 96 = 5
作为输出
在这里你需要考虑两个非常重要的事情:
%运算符与*和/(在Java中)具有相同的优先级。但是前缀表达式不会以程序的方式进行评估:
% * 5 12 8
应评估为:
(5 * 12) % 8
即4
。
请更新您的算法。
您的算法不考虑运算符优先级。在程序中添加该功能!
尝试一些示例here
希望这有帮助!
答案 1 :(得分:0)
“操作顺序在前缀表示法的结构中定义,并且可以很容易地确定。要记住的一件事是,在执行操作时,操作由第二个操作数应用于第一个操作数。这不是通勤操作的问题,但对于非交换操作(如除法或减法),这一事实对于语句的分析至关重要。例如,以下语句:
/ 10 5
读作“10除以5”。因此,解决方案是2,而不是1/2,因为不正确的分析结果。
由于你没有发布错误的结果,我认为这是你的问题