Java 使用堆栈和队列进行中缀到后缀的转换。正在尝试将(A+;B转换为AB+;)。现在不用担心括号了
我现在的程序适用于所有操作员,比如A+B。它也适用于像A+BxC这样的示例,但是如果您输入AxB+C,它就会出错。我只是不知道我错在哪里。(我知道“x”不是Java的乘法运算符,但星号不会出现)。此外,我们正在使用我们创建的堆栈和队列类 为什么A/B+C不能工作 提前谢谢Java 使用堆栈和队列进行中缀到后缀的转换。正在尝试将(A+;B转换为AB+;)。现在不用担心括号了,java,stack,queue,Java,Stack,Queue,我现在的程序适用于所有操作员,比如A+B。它也适用于像A+BxC这样的示例,但是如果您输入AxB+C,它就会出错。我只是不知道我错在哪里。(我知道“x”不是Java的乘法运算符,但星号不会出现)。此外,我们正在使用我们创建的堆栈和队列类 为什么A/B+C不能工作 提前谢谢 public class PostfixEval { public static void main(String[] args) throws IOException { File file = new File(
public class PostfixEval {
public static void main(String[] args) throws IOException {
File file = new File("infile.txt"); // infile contains single expression
Scanner kb = new Scanner(file);
Queue Q1 = new Queue();
Queue Q2 = new Queue();
Stack S1 = new Stack();
while (kb.hasNext()) {
String equation = kb.next();
char ch;
for (int i = 0; i < equation.length(); i++) {
ch = equation.charAt(i);
Q1.add2Rear(ch);
}
while (!Q1.ismtQ()) {
ch = Q1.removeFront();
if (Character.isLetter(ch)) {
Q2.add2Rear(ch);
} else if (isOperator(ch)) {
if (!S1.ismt() && checkPrecedence(ch) <= checkPrecedence(S1.top())) {
Q2.add2Rear(S1.pop());
;
}
S1.push(ch);
}
}
while (!S1.ismt()) {
Q2.add2Rear(S1.pop());
}
}
while (!Q2.ismtQ()) {
System.out.print(Q2.removeFront());
}
kb.close();
}
public static boolean isOperator(char ch) {
boolean retval = false;
if (ch == '+' || ch == '-' || ch == '/' || ch == '*')
retval = true;
return retval;
}
public static int checkPrecedence(char ch) {
switch (ch) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
}
return -1;
}
}
公共类事后评估{
公共静态void main(字符串[]args)引发IOException{
File File=new File(“infle.txt”);//infle包含单个表达式
扫描仪kb=新扫描仪(文件);
队列Q1=新队列();
队列Q2=新队列();
堆栈S1=新堆栈();
while(kb.hasNext()){
字符串方程=kb.next();
char ch;
对于(int i=0;i 如果(!S1.ismt()&&checkpreference(ch),那么我是新来的,不确定我是否应该回答我自己的问题,但我已经找到了答案(根据我被指派完成的任务),也许其他人需要答案
这是更新的代码:
if (!S1.ismt()) {
if(checkPrecedence(ch) <= checkPrecedence(S1.top())){
Q2.add2Rear(S1.pop());
}
}
if(!S1.ismt()){
如果(checkpreference(ch),这与你在问题中发布的内容在效果上没有什么不同。你一定改变了其他东西。现在不担心括号是没有用的。你只会得到一些你可能需要大幅度改变的东西。这是一个标准算法,只需全部实现即可。
public class Queue implements QueueInterface {
ArrayList<Character> que = new ArrayList<Character>();
@Override
public void add2Rear(char ch) { // add element to rear of queue
que.add(ch);
}
@Override
public char removeFront() { // returns first element AND removes it
char retval = '1';
retval = que.remove(0);
return retval;
}
@Override
public char front() { // returns first element
char retval = '1';
retval = que.get(0);
return retval;
}
@Override
public boolean ismtQ() { // true: if empty, false: if otherwise
boolean retval = true;
retval = que.isEmpty();
return retval;
}
}
if (!S1.ismt()) {
if(checkPrecedence(ch) <= checkPrecedence(S1.top())){
Q2.add2Rear(S1.pop());
}
}