Advertisement
Guest User

Untitled

a guest
Apr 10th, 2013
485
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. package guava;
  2.  
  3. import java.util.Stack;
  4.  
  5. /**
  6. *
  7. * @author rtibbetts268
  8. */
  9. public class ThrowablesPlayground
  10. {
  11.  
  12. public static void main(String[] args) {
  13. System.out.println(new ThrowablesPlayground().convert2Postfix("-4"));
  14. }
  15. /**
  16. * Operators in reverse order of precedence.
  17. */
  18. private static final String operators = "_-+/*";
  19. private static final String operands = "0123456789x";
  20.  
  21. public String convert2Postfix(String infixExpr){
  22. char[] chars = infixExpr.toCharArray();
  23. StringBuilder in = new StringBuilder();
  24. for (int i=0;i<chars.length;++i){
  25. if (infixExpr.charAt(i) == '-'){
  26. if (isOperand(infixExpr.charAt(i+1))){
  27. if (i != infixExpr.length()){
  28. if (isOperator(infixExpr.charAt(i))) {
  29. in.append('_');
  30. }
  31. }
  32. else{
  33. in.append(infixExpr.charAt(i));
  34. }
  35. }
  36. else{
  37. in.append(infixExpr.charAt(i));
  38. }
  39. }
  40. else{
  41. in.append(infixExpr.charAt(i));
  42. }
  43. }
  44.  
  45. chars = in.toString().toCharArray();
  46. Stack<Character> stack = new Stack<Character>();
  47. StringBuilder out = new StringBuilder();
  48. for (char c : chars){
  49. if (isOperator(c)){
  50. while (!stack.isEmpty() && stack.peek() != '('){
  51. if (operatorGreaterOrEqual(stack.peek(), c)){
  52. out.append(stack.pop());
  53. }
  54. else{
  55. break;
  56. }
  57. }
  58. stack.push(c);
  59. }
  60. else if (c == '('){
  61. stack.push(c);
  62. }
  63. else if (c == ')'){
  64. while (!stack.isEmpty() && stack.peek() != '(')
  65. {
  66. out.append(stack.pop());
  67. }
  68. if (!stack.isEmpty())
  69. {
  70. stack.pop();
  71. }
  72. }
  73. else if (isOperand(c)){
  74. System.out.println("33333="+c);
  75. out.append(c);
  76. }
  77. }
  78. while (!stack.empty()){
  79. out.append(stack.pop());
  80. }
  81. return out.reverse().toString();
  82. }
  83.  
  84. public int evaluatePostfix(String postfixExpr)
  85. {
  86. char[] chars = postfixExpr.toCharArray();
  87. Stack<Integer> stack = new Stack<Integer>();
  88. for (char c : chars)
  89. {
  90. if (isOperand(c))
  91. {
  92. stack.push(c - '0'); // convert char to int val
  93. }
  94. else if (isOperator(c))
  95. {
  96. int op1 = stack.pop();
  97. int op2 = stack.pop();
  98. int result;
  99. switch (c) {
  100. case '*':
  101. result = op1 * op2;
  102. stack.push(result);
  103. break;
  104. case '/':
  105. result = op2 / op1;
  106. stack.push(result);
  107. break;
  108. case '+':
  109. result = op1 + op2;
  110. stack.push(result);
  111. break;
  112. case '-':
  113. result = op2 - op1;
  114. stack.push(result);
  115. break;
  116. }
  117. }
  118. }
  119. return stack.pop();
  120. }
  121.  
  122. private int getPrecedence(char operator)
  123. {
  124. int ret = 0;
  125. if (operator == '_')
  126. {
  127. ret = 0;
  128. }
  129. if (operator == '-' || operator == '+')
  130. {
  131. ret = 1;
  132. }
  133. else if (operator == '*' || operator == '/')
  134. {
  135. ret = 2;
  136. }
  137. return ret;
  138. }
  139.  
  140. private boolean operatorGreaterOrEqual(char op1, char op2)
  141. {
  142. return getPrecedence(op1) >= getPrecedence(op2);
  143. }
  144.  
  145. private boolean isOperator(char val)
  146. {
  147. return operators.indexOf(val) >= 0;
  148. }
  149.  
  150. private boolean isOperand(char val)
  151. {
  152. return operands.indexOf(val) >= 0;
  153. }
  154.  
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement