我已经为后缀计算器写了一个中缀。 只要中缀方程有效,它就能正常工作,但我无法弄清楚如何处理无效方程。
我的程序从由换行符分隔的文本文件中读取中缀方程式。它将转换后的后缀问题的结果打印到新的文本文件中。我试图让它如此,如果一个方程式无效,而不是打破程序它只是打印"无效"在输出页面上。我不知道该怎么办!
我的想法是在交换机列表中创建一个案例,提到"所有其他字符"不知何故,因为任何不是运算符或操作数的字符,但我根本无法工作,而且我很怀疑它是不可能的。
public class ExpressionTools extends ConsoleCalculator {
//for infix to postfix
static Stack s;
static String in;
private String out = "";
/**
* expression tools
* @param input
*/
public ExpressionTools(String input) {
in = input; // input = inputed string
s = new Stack<Character>(); // stack = stack of chars
}
/**
* Determines string precedence
* @throws PostFixException
* @throws IOException
*/
public String precedence() throws PostFixException, IOException {
// check for string precedence
// for each character in the given string
for (int i = 0; i < in.length(); i++) {
char cha = in.charAt(i);
switch (cha) {
// if + or -
case '+':
case '-':
operator(cha, 1);
break;
// First level of precedence
// if * or /
case '*':
case '/':
operator(cha, 2); // pop
break;
// second level of precedence
case '(':
s.push(cha); // if open paren, add to stack
break;
case ')':
parentheses(cha); // pop operators
break;
default:
out = out + cha;
break;// write to output string
}
}
// while stack is not empty, add character to output
while (!s.isEmpty()) {
out = out + s.pop();
}
postfix.add(out);
return out; // returns postfix expression
}
/**
* sets precedence of operators
*
* @param oper
* @param precedence1
* @throws PostFixException
* @throws IOException
*/
public void operator(char oper, int precedence1) throws PostFixException, IOException {
// while the stack is not empty
// check precedence of operators
while (!s.isEmpty()) {
char head = (char) s.pop();
if (head == '(') { // if bracket, push character
s.push(head);
break;
} else {
int precedence2;
if (head == '+' || head == '-')
precedence2 = 1;
else
precedence2 = 2;
// if the precedence of the new operator
// is less than the precedence of the old operator
if (precedence2 < precedence1) {
s.push(head); // push operator to stack
break;
}
// if precedence not less, print to output
else
out = out + head;
}
}
s.push(oper);
}
/**
* if parentheses is open paren, ignore else print to output
*
* @param c
* @throws PostFixException
* @throws IOException
*/
public void parentheses(char c) throws PostFixException, IOException {
if(s.isEmpty()) out = "Invalid";
while (!s.isEmpty()) {
char a = (char) s.pop();
// if(((Stack) s.peek()).isEmpty()){}
if (a == '(')
break;
else
out = out + a;
}
}
我对此很失落!
修改 我已经尝试通过算法运行输入,该算法将其置于正确的格式(数字空间操作员空间编号等),这肯定解决了很多问题,但我认为问题的主要部分是使用堆栈更容易发现。
例如,在最后一个方法括号中,我尝试添加:
if(s.isEmpty()) out = "Invalid";
但是由于某种原因,它不起作用,如果发生if语句,输出永远不会打印,而是我只是得到一个错误并且程序停止运行,我不知道为什么。