2025-04-25 19:51:03 +03:00

171 lines
6.7 KiB
Java

public class Postfix {
public static String convertToPostfix(String infix) {
StackInterface<Character> operatorStack = new LinkedStack<>();
char[] postfixArray = new char[infix.length()]; // Max possible size
int postfixIndex = 0;
int index = 0;
char nextCharacter = ' ';
char topOperator = ' ';
while (index < infix.length()) {
nextCharacter = infix.charAt(index);
switch (nextCharacter) {
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
postfixArray[postfixIndex++] = nextCharacter;
break;
case '^':
operatorStack.push(nextCharacter);
break;
case '+': case '-': case '*': case '/':
while (!operatorStack.isEmpty() &&
!isBigger(nextCharacter, operatorStack.peek())) {
postfixArray[postfixIndex++] = operatorStack.pop();
}
operatorStack.push(nextCharacter);
break;
case '(':
operatorStack.push(nextCharacter);
break;
case ')':
topOperator = operatorStack.pop();
while (topOperator != '(') {
postfixArray[postfixIndex++] = topOperator;
topOperator = operatorStack.pop();
}
break;
default:
break;
}
index++;
}
while (!operatorStack.isEmpty()) {
postfixArray[postfixIndex++] = operatorStack.pop();
}
// Create string only from the used portion of the array
return new String(postfixArray, 0, postfixIndex);
}
// Rest of the class remains the same (isBigger, precedenceLevel, evaluatePostfix, etc.)
private static boolean isBigger(char ch1, char ch2) {
return precedenceLevel(ch1) > precedenceLevel(ch2);
}
private static int precedenceLevel(char op) {
switch (op) {
case '(': return 0;
case '+': case '-': return 1;
case '*': case '/': return 2;
case '^': return 3;
default: throw new IllegalArgumentException("Operator unknown: " + op);
}
}
public static int evaluatePostfix(String postfix) {
StackInterface<Integer> valueStack = new LinkedStack<>();
int index = 0;
char nextCharacter = ' ';
Integer operandTwo, operandOne;
int result;
while (index < postfix.length()) {
nextCharacter = postfix.charAt(index);
switch (nextCharacter) {
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
valueStack.push(getValue(nextCharacter));
break;
case '+': case '-': case '*': case '/': case '^':
operandTwo = valueStack.pop();
operandOne = valueStack.pop();
result = calculate(operandOne,operandTwo,nextCharacter);
valueStack.push(result);
break;
default: break;
}
index++;
}
return valueStack.peek();
}
private static Integer getValue(char op) {
Integer[] values = {2, 3, 4, 5, 6}; // a, b, c, d, e
return values[op-97];
}
private static Integer calculate(Integer opd1, Integer opd2, char opr) {
Integer intObj = 0;
switch (opr) {
case '+': intObj = opd1 + opd2; break;
case '-': intObj = opd1 - opd2; break;
case '*': intObj = opd1 * opd2; break;
case '/':
if (opd2.equals(0))
throw new ArithmeticException("Division by zero");
else
intObj = opd1 / opd2;
break;
case '^': intObj = (int) Math.pow(opd1, opd2); break;
default: break;
}
return intObj;
}
public static int evaluateInfix(String infix) {
StackInterface<Character> operatorStack = new LinkedStack<>();
StackInterface<Integer> valueStack = new LinkedStack<>();
int index = 0;
char nextCharacter = ' ';
char topOperator = ' ';
Integer operandTwo, operandOne;
int result;
while (index < infix.length()) {
nextCharacter = infix.charAt(index);
switch (nextCharacter) {
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
valueStack.push(getValue(nextCharacter));
break;
case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
valueStack.push(Character.getNumericValue(nextCharacter));
break;
case '^':
operatorStack.push(nextCharacter);
break;
case '+': case '-': case '*': case '/':
while (!operatorStack.isEmpty() &&
!isBigger(nextCharacter, operatorStack.peek())) {
topOperator = operatorStack.pop();
operandTwo = valueStack.pop();
operandOne = valueStack.pop();
result = calculate(operandOne,operandTwo,topOperator);
valueStack.push(result);
}
operatorStack.push(nextCharacter);
break;
case '(':
operatorStack.push(nextCharacter);
break;
case ')':
topOperator = operatorStack.pop();
while (topOperator != '(') {
operandTwo = valueStack.pop();
operandOne = valueStack.pop();
result = calculate(operandOne,operandTwo,topOperator);
valueStack.push(result);
topOperator = operatorStack.pop();
}
break;
default: break;
}
index++;
}
while (!operatorStack.isEmpty()) {
topOperator = operatorStack.pop();
operandTwo = valueStack.pop();
operandOne = valueStack.pop();
result = calculate(operandOne,operandTwo,topOperator);
valueStack.push(result);
}
return valueStack.peek();
}
}