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 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 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 ExpressionEvaluator {
- public static int evaluateExpression(String expression) {
- // Vasiot kod tuka
- ArrayStack<String> stek = new ArrayStack<String>(expression.length());
- boolean mnozenje = false;
- String broj = "";
- //Измини ја целиот стринг, карактер по карактер
- for (char c : expression.toCharArray()) {
- //Ако налетаме на знак
- if (c == '+' || c == '*') {
- //Ако последниот знак бил множење
- if(mnozenje){
- mnozenje = false;
- //Извади го последниот број од стекот, помножи го со сегашниот, и зачувај ги во broj променливата
- int mnoz = Integer.parseInt(broj) * Integer.parseInt(stek.pop());
- broj = mnoz + "";
- }
- //Ако треба да се множи, запамти
- if(c=='*'){
- mnozenje = true;
- }
- //Ако до сега сме работеле со број, додади го во стекот и ресетирај ја променливата
- stek.push(broj);
- broj = "";
- }
- //Ако налетаме на бројка, едноставно конкатанирај стринг
- else {
- broj += c + "";
- }
- }
- //Направи ја последната проверка, бидејќи ние правиме множење кога ќе налетаме на знак, а последниот
- //карактер секогаш ќе ни е бројка, така да мора да провериме повторно
- if(mnozenje){
- mnozenje = false;
- int mnoz = Integer.parseInt(broj) * Integer.parseInt(stek.pop());
- //Овде го додаваме назад во стекот а не во broj променливата бидејќи е последен
- stek.push(mnoz+"");
- }
- else{
- stek.push(broj);
- }
- //Собери ги членовите од стекот
- int sum = 0;
- while(!stek.isEmpty()){
- sum+=Integer.parseInt(stek.pop());
- }
- return sum;
- }
- public static void main(String[] args) throws IOException {
- BufferedReader input = new BufferedReader(new InputStreamReader(
- System.in));
- System.out.println(evaluateExpression(input.readLine()));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement