Advertisement
sfrsnyz

TIMP 2 V

May 31st, 2021
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.54 KB | None | 0 0
  1. ///////////// Stack
  2. public class Stack<T> {
  3. private Node top; //голова стэка
  4. private int size; //размер стэка
  5.  
  6. public Stack() { //конструктор
  7. this.top = null;
  8. size=0;
  9. }
  10. private boolean isEmpty(){
  11. return top==null;
  12. } //проверка стэка на пустоту
  13.  
  14. public int getSize() { //геттер размера
  15. return size;
  16. }
  17.  
  18. public T getTop() { //получить головной элемент
  19. return (T)top.memory;
  20. }
  21.  
  22. public void push(T el){ //добавление элемента в начало стэка
  23. Node node=new Node(el);
  24. if(isEmpty()){
  25. top=node;
  26. size++;
  27. }
  28. else{
  29. node.next=top;
  30. top=node;
  31. size++;
  32. }
  33. }
  34.  
  35. public void pop(){ //удаление головы стэка
  36.  
  37. if(!isEmpty()){
  38. if(top.next!=null){
  39. top=top.next;
  40. size--;
  41. }
  42. else{
  43. top=null;
  44. size--;
  45. }
  46. }
  47.  
  48. }
  49. }
  50.  
  51. ///////////// Node
  52. public class Node<T> { //узел стэка
  53. public T memory; //данные узла
  54. public Node next; //ссылка на следующий элемент
  55.  
  56. public Node(T memory) {
  57. this.memory = memory;
  58. }
  59.  
  60. }
  61.  
  62. ///////////////// Main
  63. public class Main {
  64. public static void main(String[] args) {
  65. boolean prov=false;
  66. Stack<String > polska=new Stack(); //Стэк используемый для обратной польской нотации
  67. String primer="12*0.2*3-15/(0.3*3+6*0.4)"; //данное выражение
  68. String[] exp=primer.split("");
  69. String numbers_="1234567890.";
  70. String[] numbers=numbers_.split(""); //строка с числами
  71. String op="/*+-(";
  72. String[] operands=op.split(""); //строка с операндами
  73. String polskaStr="";//строка для обратной польской нотации
  74. Stack<Double> calculat=new Stack<>(); //стэк для вычисление польской нотации
  75. String str="";
  76. System.out.println("Исходное выражение: "+primer); // выводим исходное выражение
  77.  
  78. //запись обратной польской нотации
  79. for(int i=0;i<exp.length;i++){
  80. for(int j=0;j<operands.length;j++) {
  81. //проверка символа на операнд
  82. if(exp[i].equals(operands[j])){
  83. if (exp[i].equals("-")||exp[i].equals("+")) {
  84. int size = polska.getSize();
  85. for(int k=0;k<size;k++){
  86. String top=(String) polska.getTop();
  87. if(top.equals("(")){
  88. continue;
  89. }
  90. polskaStr=String.format("%s%s",polskaStr,top);
  91. polska.pop();
  92. }
  93. String top=exp[i];
  94. polska.push(top);
  95. prov=true;
  96. break;
  97. }
  98. String top=exp[i];
  99. polska.push(top);
  100. prov=true;
  101. break;
  102. }
  103. }
  104. //проверка символа на число
  105. for(int j=0;j<numbers.length;j++){
  106. if(exp[i].equals(numbers[j])){
  107. if(prov){
  108. polskaStr=String.format("%s%s",polskaStr," ");
  109. prov=false;
  110. }
  111. String top=exp[i];
  112. polskaStr=String.format("%s%s",polskaStr,top);
  113. }
  114. }
  115. if(exp[i].equals(")")){
  116. int razm=polska.getSize();
  117. for(int j=0;j< razm;j++){
  118. String rop=(String) polska.getTop();
  119. if(rop.equals("(")){
  120. polska.pop();
  121. break;
  122. }
  123. polskaStr=String.format("%s%s",polskaStr,rop);
  124. polska.pop();
  125. }
  126. }
  127. }
  128. int razm=polska.getSize();
  129. for(int k=0;k<razm;k++){
  130. String top=(String) polska.getTop();
  131. polskaStr=String.format("%s%s",polskaStr,top);
  132. polska.pop();
  133. }
  134. System.out.println("Обратная польская нотация: "+polskaStr); //вывод обратной польской нотации
  135. String[] polishNotation=polskaStr.split("");
  136. //вычисление выражения с помощью
  137. for (int i=0;i<polishNotation.length;i++){
  138. if(polishNotation[i].equals(" ")){
  139. continue;
  140. }
  141. for(int k=0;k<numbers.length;k++){
  142. if(polishNotation[i].equals(numbers[k])){
  143. str=str+polishNotation[i];
  144. if(polishNotation[i+1].equals(" ")||
  145. polishNotation[i+1].equals("+")||
  146. polishNotation[i+1].equals("-")||
  147. polishNotation[i+1].equals("/")||
  148. polishNotation[i+1].equals("*")){
  149. double num=Double.parseDouble(str);
  150. calculat.push(num);
  151. str="";
  152. }
  153.  
  154. }
  155. }
  156. for(int j=0;j<operands.length;j++){
  157. if(polishNotation[i].equals(operands[j])){
  158. double a=(double)calculat.getTop();
  159. calculat.pop();
  160. double b=(double)calculat.getTop();
  161. calculat.pop();
  162. if (polishNotation[i].equals("-"))
  163. calculat.push(b - a);
  164.  
  165. if (polishNotation[i].equals("+"))
  166. calculat.push(b+a);
  167.  
  168. if (polishNotation[i].equals("*"))
  169. calculat.push(b*a);
  170.  
  171. if (polishNotation[i].equals("/"))
  172. calculat.push(b/a);
  173.  
  174. }
  175. }
  176.  
  177. }
  178. System.out.println("Результат вычисления: "+calculat.getTop());
  179.  
  180.  
  181.  
  182. }
  183.  
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement