Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package guava;
- import java.util.Stack;
- /**
- *
- * @author rtibbetts268
- */
- public class ThrowablesPlayground
- {
- public static void main(String[] args) {
- System.out.println(new ThrowablesPlayground().convert2Postfix("-4"));
- }
- /**
- * Operators in reverse order of precedence.
- */
- private static final String operators = "_-+/*";
- private static final String operands = "0123456789x";
- public String convert2Postfix(String infixExpr){
- char[] chars = infixExpr.toCharArray();
- StringBuilder in = new StringBuilder();
- for (int i=0;i<chars.length;++i){
- if (infixExpr.charAt(i) == '-'){
- if (isOperand(infixExpr.charAt(i+1))){
- if (i != infixExpr.length()){
- if (isOperator(infixExpr.charAt(i))) {
- in.append('_');
- }
- }
- else{
- in.append(infixExpr.charAt(i));
- }
- }
- else{
- in.append(infixExpr.charAt(i));
- }
- }
- else{
- in.append(infixExpr.charAt(i));
- }
- }
- chars = in.toString().toCharArray();
- Stack<Character> stack = new Stack<Character>();
- StringBuilder out = new StringBuilder();
- for (char c : chars){
- if (isOperator(c)){
- while (!stack.isEmpty() && stack.peek() != '('){
- if (operatorGreaterOrEqual(stack.peek(), c)){
- out.append(stack.pop());
- }
- else{
- break;
- }
- }
- stack.push(c);
- }
- else if (c == '('){
- stack.push(c);
- }
- else if (c == ')'){
- while (!stack.isEmpty() && stack.peek() != '(')
- {
- out.append(stack.pop());
- }
- if (!stack.isEmpty())
- {
- stack.pop();
- }
- }
- else if (isOperand(c)){
- System.out.println("33333="+c);
- out.append(c);
- }
- }
- while (!stack.empty()){
- out.append(stack.pop());
- }
- return out.reverse().toString();
- }
- public int evaluatePostfix(String postfixExpr)
- {
- char[] chars = postfixExpr.toCharArray();
- Stack<Integer> stack = new Stack<Integer>();
- for (char c : chars)
- {
- if (isOperand(c))
- {
- stack.push(c - '0'); // convert char to int val
- }
- else if (isOperator(c))
- {
- int op1 = stack.pop();
- int op2 = stack.pop();
- int result;
- switch (c) {
- case '*':
- result = op1 * op2;
- stack.push(result);
- break;
- case '/':
- result = op2 / op1;
- stack.push(result);
- break;
- case '+':
- result = op1 + op2;
- stack.push(result);
- break;
- case '-':
- result = op2 - op1;
- stack.push(result);
- break;
- }
- }
- }
- return stack.pop();
- }
- private int getPrecedence(char operator)
- {
- int ret = 0;
- if (operator == '_')
- {
- ret = 0;
- }
- if (operator == '-' || operator == '+')
- {
- ret = 1;
- }
- else if (operator == '*' || operator == '/')
- {
- ret = 2;
- }
- return ret;
- }
- private boolean operatorGreaterOrEqual(char op1, char op2)
- {
- return getPrecedence(op1) >= getPrecedence(op2);
- }
- private boolean isOperator(char val)
- {
- return operators.indexOf(val) >= 0;
- }
- private boolean isOperand(char val)
- {
- return operands.indexOf(val) >= 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement