Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.NoSuchElementException;
- interface Queue<E> {
- // Elementi na redicata se objekti od proizvolen tip.
- // Metodi za pristap:
- public boolean isEmpty();
- // Vrakja true ako i samo ako redicata e prazena.
- public int size();
- // Ja vrakja dolzinata na redicata.
- public E peek();
- // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
- // Metodi za transformacija:
- public void clear();
- // Ja prazni redicata.
- public void enqueue(E x);
- // Go dodava x na kraj od redicata.
- public E dequeue();
- // Go otstranuva i vrakja pochetniot element na redicata.
- };
- interface Stack<E> {
- // Elementi na stekot se objekti od proizvolen tip.
- // Metodi za pristap:
- public boolean isEmpty();
- // Vrakja true ako i samo ako stekot e prazen.
- public E peek();
- // Go vrakja elementot na vrvot od stekot.
- // Metodi za transformacija:
- public void clear();
- // Go prazni stekot.
- public void push(E x);
- // Go dodava x na vrvot na stekot.
- public E pop();
- // Go otstranuva i vrakja elementot shto e na vrvot na stekot.
- };
- class ArrayQueue<E> implements Queue<E> {
- // Redicata e pretstavena na sledniot nacin:
- // length go sodrzi brojot na elementi.
- // Ako length > 0, togash elementite na redicata se zachuvani vo
- // elems[front...rear-1]
- // Ako rear > front, togash vo elems[front...maxlength-1] i
- // elems[0...rear-1]
- E[] elems;
- int length, front, rear;
- @SuppressWarnings("unchecked")
- public ArrayQueue(int maxlength) {
- elems = (E[]) new Object[maxlength];
- clear();
- }
- public boolean isEmpty() {
- // Vrakja true ako i samo ako redicata e prazena.
- return (length == 0);
- }
- public int size() {
- // Ja vrakja dolzinata na redicata.
- return length;
- }
- public E peek() {
- // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
- if (length > 0)
- return elems[front];
- else
- throw new NoSuchElementException();
- }
- public void clear() {
- // Ja prazni redicata.
- length = 0;
- front = rear = 0; // arbitrary
- }
- public void enqueue(E x) {
- // Go dodava x na kraj od redicata.
- elems[rear++] = x;
- if (rear == elems.length)
- rear = 0;
- length++;
- }
- public E dequeue() {
- // Go otstranuva i vrakja pochetniot element na redicata.
- if (length > 0) {
- E frontmost = elems[front];
- elems[front++] = null;
- if (front == elems.length)
- front = 0;
- length--;
- return frontmost;
- } else
- throw new NoSuchElementException();
- }
- };
- class ArrayStack<E> implements Stack<E> {
- // Stekot e pretstaven na sledniot nacin:
- // depth e dlabochinata na stekot, a
- // elems[0...depth-1] se negovite elementi.
- private E[] elems;
- private int depth;
- @SuppressWarnings("unchecked")
- public ArrayStack(int maxDepth) {
- // Konstrukcija na nov, prazen stek.
- elems = (E[]) new Object[maxDepth];
- depth = 0;
- }
- public boolean isEmpty() {
- // Vrakja true ako i samo ako stekot e prazen.
- return (depth == 0);
- }
- public E peek() {
- // Go vrakja elementot na vrvot od stekot.
- if (depth == 0)
- throw new NoSuchElementException();
- return elems[depth - 1];
- }
- public void clear() {
- // Go prazni stekot.
- for (int i = 0; i < depth; i++)
- elems[i] = null;
- depth = 0;
- }
- public void push(E x) {
- // Go dodava x na vrvot na stekot.
- elems[depth++] = x;
- }
- public E pop() {
- // Go otstranuva i vrakja elementot shto e na vrvot na stekot.
- if (depth == 0)
- throw new NoSuchElementException();
- E topmost = elems[--depth];
- elems[depth] = null;
- return topmost;
- }
- public String toString() {
- String st = "";
- for (int i = 0; i < depth; i++) {
- st += elems[i] + " ";
- }
- return st;
- }
- };
- public class Aretmeticki {
- // funkcija za presmetuvanje na izrazot pocnuvajki
- // od indeks l, zavrsuvajki vo indeks r
- static int presmetaj(char c[], int l, int r) {
- int rez = 0;
- ArrayStack<String> stek = new ArrayStack<String>(c.length);
- boolean voBroj = false;
- String broj = "";
- for (int i = l; i <= r; i++) {
- char tmp = c[i];
- // Линија за дебагирање, т.е. следење на променливите
- // System.out.println("Vaka: " + stek + " ; voBroj: " + voBroj +
- // " ; broj: " + broj + " ; segasen: " + tmp);
- if (stek.isEmpty()) {
- stek.push(tmp + "");
- } else if (tmp == '(' || tmp == ')' || tmp == '+' || tmp == '-') {
- if (voBroj) {
- if (stek.peek().equals("+") || stek.peek().equals("-")) {
- String tmp2 = stek.pop();
- if (stek.peek().equals("+") || stek.peek().equals("-")
- || stek.peek().equals("(")
- || stek.peek().equals(")")) {
- stek.push(tmp2);
- stek.push(broj);
- stek.push(tmp + "");
- } else {
- // Малку подсреден код само
- int sum;
- if (tmp2.equals("+")) {
- sum = Integer.parseInt(stek.peek())
- + Integer.parseInt(broj);
- } else {
- sum = Integer.parseInt(stek.peek())
- - Integer.parseInt(broj);
- }
- stek.pop();
- stek.pop();
- // ГРЕШКАТА е тука. Не требаше да се додава во
- // стекот бројот, туку треба да се памти како број
- // со
- // кој што сеуште работиме, како да го градиме
- // сеуште
- // stek.push(sum + ""); //грешна линија
- broj = sum + ""; // точна линија
- }
- } else {
- stek.push(broj);
- stek.push(tmp + "");
- voBroj = false;
- broj = "";
- }
- } else {
- stek.push(tmp + "");
- }
- } else {
- // Опростување на кодот, комплено ист како претходно
- voBroj = true;
- broj += tmp;
- }
- }
- // Сега стекот ќе ни е празен на крајот, и во broj ќе ни е резултатот
- return Integer.parseInt(broj);
- }
- public static void main(String[] args) throws Exception {
- int i, j, k;
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- String expression = br.readLine();
- char exp[] = expression.toCharArray();
- int rez = presmetaj(exp, 0, exp.length - 1);
- System.out.println(rez);
- br.close();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement