0 / 0 / 0
Регистрация: 11.02.2017
Сообщений: 16
1

Stack калькулятор

20.02.2018, 10:47. Показов 3703. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!

Пишу программу, по заданию
"Нужно написать интерпретатор который исполняет программу стэкового для калькулятора, например такую:

PUSH 6
PUSH 5
PUSH 4
ADD
PRINT

в данной программе мы кладем в стэк 6, потом 5, потом сверху кладем 4. В результате там оказываются 3 числа 6,5,4. На верху стэка 4, т.к. его положили последним. Стэк можно себе представить в виде глубокой коробки, стоящей на полу. Вы можете класть только на самый верх этой коробки и брать элементы только с самого верха. Стэк уже реализован в классе Stack<Double> в java. В результате выполнения ADD программа должна вытащить (stack.push()) два самых верхних значения из стэка и положить в замен них сумму 9. PRINT выдает значение стэка на экран (System.out.println(stack.toString()), в данном случае два числа: 6 и 9. Реализовать помимо этих следующие комманды:

POP -- вытащить самое верхнее число и написать его в консоль

MUL, DIV, SUB -- умножение, деление, сложение

DEFINE a 5 -- определяет константу a, равную 5, которая будет храниться в Map<String,Double> в калькуляторе. Далее константы можно использовать в операторе PUSH.

Калькулятор написать в первом приближении без многих классов с одной функцией main, внутри которой бесконечный цикл, читающий с консоли. Каждая строка, прочитанная с консоли, разделяется по пробелу с помощью String.split(“ ”). Нулевой элемент полученного массива -- имя комманды, первый (если есть) -- её аргумент. Далее делается перебор возможных комманд в блоках if-else и для каждой комманды исполняется свой код."

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class StackCalc {
    
    private static final double a = 5;
    
     public static void main(String[] args) {
          
         Stack<Double> stack = new Stack<Double>();
         Map<String, Double> map = new HashMap<String, Double>();
         double number;
         // Получаем первое число = 5
         map.put("first", a);
         double firstNumber = map.get("first");
         
         Scanner in = new Scanner(System.in);
         String str = "";
        
         System.out.println("Стековый калькулятор");
         System.out.println("Используем стек в формате 'PUSH число' - добавление числа, ADD сложения двух верхних чисел, PRINT вывод стека");
         System.out.println("Альтернативно можем по второму стеку делать рассчеты '*, /, +, -', начальное значение" + 
         map + " команды SUB MIN MUL DIV, PRINTNUMBER");
         
         while(!(str.equals("QUIT"))) {
             
             str = in.nextLine().trim().toUpperCase();
             // разбиваем на массив 0 - push 1 - number
             String[] parts = str.split(" ");
             
            if(parts[0].equals("PUSH")) {
                stack.push(Double.valueOf(parts[1]));
            }else if(parts[0].equals("ADD")) {
                double val = stack.pop() + stack.pop();
                stack.push(val);
            }else if(parts[0].equals("POP")) {
                double pNumber = stack.pop();
                System.out.println(pNumber);
            }else if(parts[0].equals("PRINT")) {
                System.out.println(stack.toString());
            }else if(parts[0].equals("MUL")) {
                number = in.nextDouble();
                double mulNumber = firstNumber * number;
                firstNumber = mulNumber;
                System.out.println(firstNumber);
            }else if(parts[0].equals("DIV")) {
                number = in.nextDouble();
                double divNumber = firstNumber / number;
                firstNumber = divNumber;
                System.out.println(firstNumber);
            }else if(parts[0].equals("SUB")) {
                number = in.nextDouble();
                double subNumber = firstNumber + number;
                firstNumber = subNumber;
                System.out.println(firstNumber);
            }else if(parts[0].equals("MIN")) {
                number = in.nextDouble();
                double minNumber = firstNumber - number;
                firstNumber = minNumber;
                System.out.println(firstNumber);
            }else if(parts[0].equals("PRINTNUMBER")) {
                System.out.println(firstNumber);
            }
            
         }
 
        }
    }
Подскажите, правильно ли я понял задание и как мой код, может быть, что-то стоит сделать лучше.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2018, 10:47
Ответы с готовыми решениями:

Stack search()
Всем привет! Вопрос такого плана. Есть несколько объектов одного класса, с полем, допустим, name....

Stack на практике
Зачем нужен стек , в чем ее плюсы и минусы , слышал что ее применят для реализаций меню в играх...

Obsolete Methods on the stack
Подскажите, что это такое и что необходимо сделать?

Память Heap и Stack
Здравствуйте , подскажите пожалуйста такой вопрос . Вот есть есть три области памяти Heap,Stack...

11
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2018, 11:03 2
Цитата Сообщение от Cold As Ice Посмотреть сообщение
можем по второму стеку
чо за второй стэк?

работы с константами нет, мэп вообще не используется

Вот эта вот простыня из if else это не очень, мягко говоря.

Добавлено через 1 минуту
ну и никак не проверяется ввод
0
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17557 / 10311 / 2819
Регистрация: 21.10.2017
Сообщений: 22,367
20.02.2018, 19:35 3
Cold As Ice, присоединяюсь к предыдущему оратору. switch вместо ифов сам напрашивается.
Цитата Сообщение от Cold As Ice Посмотреть сообщение
реализован в классе Stack<Double>
Почему именно double? Любые объекты можно юзать...
Цитата Сообщение от Cold As Ice Посмотреть сообщение
вытащить (stack.push())
Push - это "втащить"
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2018, 20:55 4
Цитата Сообщение от iSmokeJC Посмотреть сообщение
switch вместо ифов сам напрашивается.
свич еще хуже
0
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17557 / 10311 / 2819
Регистрация: 21.10.2017
Сообщений: 22,367
20.02.2018, 21:05 5
Цитата Сообщение от xoraxax Посмотреть сообщение
свич еще хуже
Чем?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2018, 21:22 6
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Чем?
google why switch is bad
можно еще clean code почитать.
1
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17557 / 10311 / 2819
Регистрация: 21.10.2017
Сообщений: 22,367
20.02.2018, 21:23 7
xoraxax, понял, пасиб.
Цитата Сообщение от xoraxax Посмотреть сообщение
clean code почитать
в процессе

Ну а что в данной ситуации посоветуешь?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2018, 21:44 8
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Ну а что в данной ситуации посоветуешь?
вот погугли, посмотри, какие решения предлагают
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,587
20.02.2018, 22:49 9
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Почему именно double? Любые объекты можно юзать...
Наверное, потому что это калькулятор?..

Цитата Сообщение от xoraxax Посмотреть сообщение
можно еще clean code почитать.
Ну, там, к слову говоря, упоминается, какие есть преимущества у функционального подхода.

В данном случае, думаю, свитч вполне можно использовать, т.к. диспетчеризацию в любом случае придётся как-то делать и свич в данном случае позволит оставить код лаконичным, понятным и вполне сопровождаемым. А городить какой-то механизм диспетчеризации, который будет автоматически матчить операции на их реализации и подключать реализации автоматически, по-моему так себе затея.

Конечно, тупо машинально переписывать эти if-else-if-… на свич тоже не нужно, а нужно разнести операции по методам и сделать отдельный метод выбора операции, упрощённо, типа такого:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class Calculator {
    
    private static final String[] EMPTY_ARGS = {};
 
    private final Stack<Double> stack;
    private String operation;
    private String[] args;
 
    Calculator() {
        stack = new Stack<>();
    }
 
    // ...
 
    public void eval(InputStream program) throws IOException {
        final BufferedReader reader = new BufferedReader(new InputStreamReader(program));
        while (true) {
            final String line = reader.readLine();
            if (line == null) {
                break;
            }
            parseCommand(line.trim());
            if (operation.isEmpty()) {
                continue;
            }
            if (operation.equals("QUIT")) {
                break;
            }
            dispatch().run();
        }
    }
 
    private void parseCommand(String line) {
        final String[] tokens = line.split("\\s");
        operation = tokens[0];
        if (tokens.length == 1) {
            args = EMPTY_ARGS;
        } else {
            args = new String[tokens.length - 1];
            System.arraycopy(tokens, 1, args, 0, args.length);
        }
    }
 
    private Runnable dispatch() {
        switch (operation) {
            case "ADD":
                return this::add;
            case "MUL":
                return this::multiply;
            // ...
            default:
                throw new UnsupportedOperationException(operation);
        }
    }
 
    private void add() {
        // add
    }
 
    private void multiply() {
        // multiply
    }
 
    // ...
}
Добавлено через 2 минуты
Про ООП-шный over-engineering, например… =)
1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
20.02.2018, 23:23 10
Цитата Сообщение от korvin_ Посмотреть сообщение
case "ADD":
* * * * * * * * return this::add;
* * * * * * case "MUL":
* * * * * * * * return this::multiply;
так немного лучше, однако все равно все в куче
0
Эксперт функциональных языков программированияЭксперт Java
4485 / 2720 / 485
Регистрация: 28.04.2012
Сообщений: 8,587
21.02.2018, 00:09 11
Цитата Сообщение от xoraxax Посмотреть сообщение
однако все равно все в куче
Что именно в куче?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
21.02.2018, 06:15 12
все. Тесты как на это писать, например?
0
21.02.2018, 06:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.02.2018, 06:15
Помогаю со студенческими работами здесь

Stack Java на массивах
Помогите пожалуйста разобраться: есть код как переделать его так, чтобы стек был реализован на...

Калькулятор комплексных чисел на С++ с использованием Stack
Не могу понять, как сделать Stack как класс-коллекция? Можете подсказать в моей ситуации? #include...

[bcc32 Error] File1.cpp(19): E2316 'Stack<T>::Stack()' is not a member of 'Stack<T>'
Возникает ошибка File1.cpp(19): E2316 'Stack&lt;T&gt;::Stack()' is not a member of 'Stack&lt;T&gt;' ...

Есть ли связь между STL-stack и stack - высокопроизводительная память?
Куча источников, как всегда много отсебятины, в общем я запутался...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru