Advertisement
HeatPulse

LAB3-1 aritmericki izrazi

Nov 2nd, 2019
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.19 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.NoSuchElementException;
  5.  
  6. interface Queue<E> {
  7.  
  8. // Elementi na redicata se objekti od proizvolen tip.
  9.  
  10. // Metodi za pristap:
  11.  
  12. public boolean isEmpty();
  13.  
  14. // Vrakja true ako i samo ako redicata e prazena.
  15.  
  16. public int size();
  17.  
  18. // Ja vrakja dolzinata na redicata.
  19.  
  20. public E peek();
  21.  
  22. // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
  23.  
  24. // Metodi za transformacija:
  25.  
  26. public void clear();
  27.  
  28. // Ja prazni redicata.
  29.  
  30. public void enqueue(E x);
  31.  
  32. // Go dodava x na kraj od redicata.
  33.  
  34. public E dequeue();
  35. // Go otstranuva i vrakja pochetniot element na redicata.
  36.  
  37. };
  38.  
  39. interface Stack<E> {
  40.  
  41. // Elementi na stekot se objekti od proizvolen tip.
  42.  
  43. // Metodi za pristap:
  44.  
  45. public boolean isEmpty();
  46.  
  47. // Vrakja true ako i samo ako stekot e prazen.
  48.  
  49. public E peek();
  50.  
  51. // Go vrakja elementot na vrvot od stekot.
  52.  
  53. // Metodi za transformacija:
  54.  
  55. public void clear();
  56.  
  57. // Go prazni stekot.
  58.  
  59. public void push(E x);
  60.  
  61. // Go dodava x na vrvot na stekot.
  62.  
  63. public E pop();
  64. // Go otstranuva i vrakja elementot shto e na vrvot na stekot.
  65. };
  66.  
  67. class ArrayQueue<E> implements Queue<E> {
  68.  
  69. // Redicata e pretstavena na sledniot nacin:
  70. // length go sodrzi brojot na elementi.
  71. // Ako length > 0, togash elementite na redicata se zachuvani vo
  72. // elems[front...rear-1]
  73. // Ako rear > front, togash vo elems[front...maxlength-1] i
  74. // elems[0...rear-1]
  75. E[] elems;
  76. int length, front, rear;
  77.  
  78. @SuppressWarnings("unchecked")
  79. public ArrayQueue(int maxlength) {
  80. elems = (E[]) new Object[maxlength];
  81. clear();
  82. }
  83.  
  84. public boolean isEmpty() {
  85. // Vrakja true ako i samo ako redicata e prazena.
  86. return (length == 0);
  87. }
  88.  
  89. public int size() {
  90. // Ja vrakja dolzinata na redicata.
  91. return length;
  92. }
  93.  
  94. public E peek() {
  95. // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
  96. if (length > 0)
  97. return elems[front];
  98. else
  99. throw new NoSuchElementException();
  100. }
  101.  
  102. public void clear() {
  103. // Ja prazni redicata.
  104. length = 0;
  105. front = rear = 0; // arbitrary
  106. }
  107.  
  108. public void enqueue(E x) {
  109. // Go dodava x na kraj od redicata.
  110. elems[rear++] = x;
  111. if (rear == elems.length)
  112. rear = 0;
  113. length++;
  114. }
  115.  
  116. public E dequeue() {
  117. // Go otstranuva i vrakja pochetniot element na redicata.
  118. if (length > 0) {
  119. E frontmost = elems[front];
  120. elems[front++] = null;
  121. if (front == elems.length)
  122. front = 0;
  123. length--;
  124. return frontmost;
  125. } else
  126. throw new NoSuchElementException();
  127. }
  128. };
  129.  
  130. class ArrayStack<E> implements Stack<E> {
  131.  
  132. // Stekot e pretstaven na sledniot nacin:
  133. // depth e dlabochinata na stekot, a
  134. // elems[0...depth-1] se negovite elementi.
  135. private E[] elems;
  136. private int depth;
  137.  
  138. @SuppressWarnings("unchecked")
  139. public ArrayStack(int maxDepth) {
  140. // Konstrukcija na nov, prazen stek.
  141. elems = (E[]) new Object[maxDepth];
  142. depth = 0;
  143. }
  144.  
  145. public boolean isEmpty() {
  146. // Vrakja true ako i samo ako stekot e prazen.
  147. return (depth == 0);
  148. }
  149.  
  150. public E peek() {
  151. // Go vrakja elementot na vrvot od stekot.
  152. if (depth == 0)
  153. throw new NoSuchElementException();
  154. return elems[depth - 1];
  155. }
  156.  
  157. public void clear() {
  158. // Go prazni stekot.
  159. for (int i = 0; i < depth; i++)
  160. elems[i] = null;
  161. depth = 0;
  162. }
  163.  
  164. public void push(E x) {
  165. // Go dodava x na vrvot na stekot.
  166. elems[depth++] = x;
  167. }
  168.  
  169. public E pop() {
  170. // Go otstranuva i vrakja elementot shto e na vrvot na stekot.
  171. if (depth == 0)
  172. throw new NoSuchElementException();
  173. E topmost = elems[--depth];
  174. elems[depth] = null;
  175. return topmost;
  176. }
  177.  
  178. public String toString() {
  179. String st = "";
  180. for (int i = 0; i < depth; i++) {
  181. st += elems[i] + " ";
  182. }
  183. return st;
  184. }
  185. };
  186.  
  187. public class Aretmeticki {
  188.  
  189. // funkcija za presmetuvanje na izrazot pocnuvajki
  190. // od indeks l, zavrsuvajki vo indeks r
  191. static int presmetaj(char c[], int l, int r) {
  192. int rez = 0;
  193. ArrayStack<String> stek = new ArrayStack<String>(c.length);
  194. boolean voBroj = false;
  195. String broj = "";
  196.  
  197. for (int i = l; i <= r; i++) {
  198. char tmp = c[i];
  199. // Линија за дебагирање, т.е. следење на променливите
  200. // System.out.println("Vaka: " + stek + " ; voBroj: " + voBroj +
  201. // " ; broj: " + broj + " ; segasen: " + tmp);
  202. if (stek.isEmpty()) {
  203. stek.push(tmp + "");
  204. } else if (tmp == '(' || tmp == ')' || tmp == '+' || tmp == '-') {
  205. if (voBroj) {
  206. if (stek.peek().equals("+") || stek.peek().equals("-")) {
  207. String tmp2 = stek.pop();
  208. if (stek.peek().equals("+") || stek.peek().equals("-")
  209. || stek.peek().equals("(")
  210. || stek.peek().equals(")")) {
  211.  
  212. stek.push(tmp2);
  213. stek.push(broj);
  214. stek.push(tmp + "");
  215. } else {
  216. // Малку подсреден код само
  217. int sum;
  218. if (tmp2.equals("+")) {
  219. sum = Integer.parseInt(stek.peek())
  220. + Integer.parseInt(broj);
  221.  
  222. } else {
  223. sum = Integer.parseInt(stek.peek())
  224. - Integer.parseInt(broj);
  225. }
  226. stek.pop();
  227. stek.pop();
  228.  
  229. // ГРЕШКАТА е тука. Не требаше да се додава во
  230. // стекот бројот, туку треба да се памти како број
  231. // со
  232. // кој што сеуште работиме, како да го градиме
  233. // сеуште
  234.  
  235. // stek.push(sum + ""); //грешна линија
  236.  
  237. broj = sum + ""; // точна линија
  238. }
  239. } else {
  240. stek.push(broj);
  241. stek.push(tmp + "");
  242. voBroj = false;
  243. broj = "";
  244. }
  245.  
  246. } else {
  247. stek.push(tmp + "");
  248. }
  249.  
  250. } else {
  251. // Опростување на кодот, комплено ист како претходно
  252. voBroj = true;
  253. broj += tmp;
  254. }
  255. }
  256.  
  257. // Сега стекот ќе ни е празен на крајот, и во broj ќе ни е резултатот
  258. return Integer.parseInt(broj);
  259.  
  260. }
  261.  
  262. public static void main(String[] args) throws Exception {
  263. int i, j, k;
  264.  
  265. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  266.  
  267. String expression = br.readLine();
  268. char exp[] = expression.toCharArray();
  269.  
  270. int rez = presmetaj(exp, 0, exp.length - 1);
  271. System.out.println(rez);
  272.  
  273. br.close();
  274.  
  275. }
  276.  
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement