Advertisement
ibragimova_mariam

Обратная польская нотация

Jan 31st, 2021
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.59 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.Stack;
  5.  
  6. public class Hello {
  7.  
  8. public static void mymain() {
  9. int ans = calculate("-2+2*(9+8)");
  10. System.out.println(ans);
  11. }
  12. static int calculate(String mathString) {
  13.  
  14. List<String> operations = new ArrayList<>(Arrays.asList("+", "-", "*", "/", "(", ")"));
  15.  
  16. int res;
  17. Stack<String> stack = new Stack<>();
  18. List<String> arr = new ArrayList<>();
  19. StringBuilder currentNum = new StringBuilder();
  20.  
  21. for (int i = 0; i < mathString.length(); i++) {
  22. String c = String.valueOf(mathString.charAt(i));
  23. if (operations.contains(c)) {
  24. if (currentNum.length() != 0) {
  25. arr.add(currentNum.toString());
  26. currentNum.setLength(0);
  27. }
  28.  
  29. if (c.equals("-") && (i == 0 || String.valueOf(mathString.charAt(i - 1)).equals("("))) {
  30. arr.add(c);
  31. }
  32. else if (c.equals(")")) {
  33. while (!stack.peek().equals("(")) {
  34. arr.add(String.valueOf(stack.pop()));
  35. }
  36. stack.pop();
  37. }
  38. else {
  39. if (!stack.isEmpty() && (c.equals("+") || c.equals("-")) && (!stack.peek().equals(")") && !stack.peek().equals("("))) {
  40. String peekStack = stack.pop();
  41. arr.add(String.valueOf(peekStack));
  42. }
  43. stack.push(c);
  44. }
  45. }
  46. else {
  47. currentNum.append(c);
  48. }
  49. }
  50. if (currentNum.length() != 0) {
  51. arr.add(currentNum.toString());
  52. currentNum.setLength(0);
  53. }
  54. while (!stack.isEmpty())
  55. arr.add(String.valueOf(stack.pop()));
  56. System.out.println(Arrays.toString(arr.toArray()));
  57.  
  58. int a, b, c;
  59. boolean negative = false;
  60. for (String s : arr) {
  61. switch (s) {
  62. case "+":
  63. a = Integer.parseInt(stack.pop());
  64. b = Integer.parseInt(stack.pop());
  65. c = b + a;
  66. stack.push(String.valueOf(c));
  67. break;
  68. case "-":
  69. if (stack.isEmpty() || stack.size() % 2 != 0) {
  70. negative = true;
  71. }
  72. else {
  73. a = Integer.parseInt(stack.pop());
  74. b = Integer.parseInt(stack.pop());
  75. c = b - a;
  76. stack.push(String.valueOf(c));
  77. }
  78. break;
  79. case "/":
  80. a = Integer.parseInt(stack.pop());
  81. b = Integer.parseInt(stack.pop());
  82. c = b / a;
  83. stack.push(String.valueOf(c));
  84. break;
  85. case "*":
  86. a = Integer.parseInt(stack.pop());
  87. b = Integer.parseInt(stack.pop());
  88. c = b * a;
  89. stack.push(String.valueOf(c));
  90. break;
  91. default:
  92. if (negative) {
  93. s = String.valueOf(Integer.parseInt(s) * -1);
  94. negative = false;
  95. }
  96. stack.push(s);
  97. }
  98. }
  99.  
  100. return Integer.parseInt(stack.pop());
  101. }
  102. }
  103.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement