Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ Конвертация чисел в двумерном массиве Здравствуйте. Есть программа, которая поток цифр в двоичной системе счисления, заносит в двумерный массив, а затем конвертирует их в восьмеричную систему счисления. Как нужно поменять программу, чтобы на ввод шли цифры десятичной системы счисления, конвертировались и выводились в шестнадцатеричной системе счисления? Заранее спасибо. // #include "stdafx.h" #include <stdio.h> #include... https://www.cyberforum.ru/ cpp-beginners/ thread2257834.html Рекурсия: найти наибольший общий делитель чисел M и N, используя теорему Эйлера C++
Составить алгоритм в виде блок-схемы, написать и отладить постав-ленную задачу с использованием рекурсивной и обычной функций. Сравнить полученные результаты. Найти наибольший общий делитель чисел M и N, используя теорему Эйлера: если M делится на N, то НОД (N,M) = N, иначе НОД (N,M) = (M%N, N). Вот что получилось,незнаю как дальше #include "stdafx.h" #include <iostream> #include <stdlib.h>...
C++ Перевод типа Integer в String Здравствуйте! Помогите пожалуйста решить проблемку. Вот задание: Структура с именем ABITYRIENT, которая имеет следующие поля: NAME - имя абитуриента GENDER - пол SPECIALIZATION - специализация GRADES - оценки по 3 предметам Создать поиск, который будет находить данные по всем полям. Предусмотреть нахождение по первому символу и по полной строке. Проблема: не могу перевести целочисельный... https://www.cyberforum.ru/ cpp-beginners/ thread2257812.html C++ Переписать/дописать структуру https://www.cyberforum.ru/ cpp-beginners/ thread2257809.html
Дело обстоит так: мне дали задание написать структуру которую надо сделать как каталог запчастей для машин. Тут должен осуществляться вывод информации из файла а потом в этот же файл мы вводом вносим изменения. После этого должен очистится экран и поступить сообщение - "какую деталь вы хотите найти?" А дальше должен идти список этих деталей. И в итоге после выбора нужной нам детали её количества...
Загрузка таблицы с возможностью её редактирования C++
Доброе, подскажите, как реализовать чтение текстового файла, и его изменение? То есть с помощью данной проги создаю таблицу, и сохраняю её. Далее, необходимо открыть таблицу с возможностью редактирования её элементов. С сохранением разобрался, а вот с загрузкой пока не ясно (находится в конце проги). #include <iostream> #include <vector> #include <fstream> struct Spectrum { ...
C++ Дано четырехзначное число: кратно ли произведение его цифр трем, кратно ли числу а произведение его первых двух цифр? Дано четырехзначное число. Определить: а) кратно ли произведение его цифр трем; б) кратно ли числу а произведение его первых двух цифр Сделать проверку корректности вводимых данных. Пример. Введите четырехзначное число: 1942 Введите целое число a: 7 Произведение всех цифр: 72 Произведение первых двух цифр: 9 а) Произведение цифр числа 1942 кратно числу 3 https://www.cyberforum.ru/ cpp-beginners/ thread2257770.html
C++ Дано натуральное число. Определить, является ли оно четным, или оканчивается цифрой 3 Дано натуральное число. Определить, является ли оно четным, или оканчивается цифрой 3. Выделить значения цветами, как показано в примере. Пример. Введите целое число n: 213 Число 213 не является четным, оканчивается цифрой 3. https://www.cyberforum.ru/ cpp-beginners/ thread2257768.html Определить что больше меньший положительный элемент массива или наибольший по модулю отрицательный? C++
Задать массив 26 целых чисел. Вывести массив на экран. Задать целое число k. Посчитать количество отрицательных элементов, модуль которых меньше k и положительных элементов массива, которые меньше k. Определить, что больше, наименьший среди компонентов с положительными значениями, или модуль наибольшего среди компонентов с отрицательными значениями. Пример: Массив 26 элементов: 2 1 -7 -8 1...
C++ Запись структуры в текстовый файл Задание: Разработайте структуру, содержащую сведения о результатах ЕГЭ по предмету: Фамилия, Имя, Отчество, Число баллов по первому предмету, Число баллов по второму предмету, Число баллов по третьему предмету. Разработайте функцию, определяющую результат поступления абитуриента по заданному проходному баллу. Введите сведения об N абитуриентах, запишите их в файл (имя файла вводится с... https://www.cyberforum.ru/ cpp-beginners/ thread2257764.html C++ Заполнение динамического массива Функция для записи и хранения имён текстовых файлов из папки (использование векторов (vector) запрещено, только массивы). После выполнения программы массив перезаписывается одинаковыми значениями, хотя каждая ячейка должна содержать свою структуру с содержанием определённого имени файла. struct FileName{ const char * name; }; FileName * AddW(FileName * word, const size_t size)//... https://www.cyberforum.ru/ cpp-beginners/ thread2257758.html
Как инициализировать матрицу уникальными случайными числами? C++
С одномерным всё понятно, но а как реализовать для двумерного? Добавлено через 51 секунду Вот для ордномерного: int arr; for (int i = 0; i < 10;) { bool alreadyThere = false;
 Аватар для Cortas
223 / 150 / 79
Регистрация: 14.03.2016
Сообщений: 459
02.06.2018, 22:44 0

Обратная польская запись - C++ - Ответ 12444615

02.06.2018, 22:44. Показов 17229. Ответов 7
Метки (Все метки)

Лучший ответ Сообщение было отмечено Alex007A как решение

Решение

Из комментариев все должно быть понятно:
C++
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
#include <iostream>
#include <conio.h>
#include <string>
#include <stack>
#include <queue>
 
using namespace std;
 
int end() { cout << "\nEND\n"; _getch(); return 0; }
 
queue<char> to_revpol(const string& in)
{
    stack<char> stk;//создаем стак для хранения временных операция
    queue<char> gen;//создаем очередь, куда все будем пихать
    for(auto i : in)//идем по строке
    {
        if(i == '.')//если это просто точка, т.е. пользователь ввел число по типу 0.2,
            gen.push(i);//то тупо пихаем её внутрь
        else if((i >= '0' && i <= '9') ||//если это число или переменная, то тоже просто запихиваем
                (i >= 'a' && i <= 'z') ||
                (i >= 'A' && i <= 'Z'))
        {
            if(gen.empty() != true &&
               (gen.back() >= '0' && gen.back() <= '9') &&
               !(i >= '0' && i <= '9'))
            { stk.push('*'); gen.push(';'); }//эта хрень нужна чтобы можно было не ставить знак умножения перед переменной при вводе 5x, например
            gen.push(i);
        }
        else if
            (i == '+' || i == '-' ||//если же это операция
             i == '*' || i == '/')
        {
            if(stk.empty() != true && (stk.top() == '*' || stk.top() == '/'))//если у нас что-то есть и последняя оперцаия была * или /, то...
            {
                if(i == '*' || i == '/')//если сейчас умножаем или делим
                {
                    gen.push(stk.top());//то можно выгрузить предыдущую операцию
                    stk.top() = i;//и заменить её
                }
                else if(i == '+' || i == '-')//если же это была оперция меньшего приоритета, т.е. + или -
                {
                    while(stk.empty() != true && stk.top() != '(')//следует выгрузить все до открывающейся скобки, либо пока стек не опустеет
                    {//зачем? А переведите на ОПН такое: a * b + c. Тут роль скобочки играет главное тело.
                        gen.push(stk.top());
                        stk.pop();
                    }
                    stk.push(i);
                }
            }
            else//если же стек пуст или последняя операция была не * или /, то...
            {
                if(gen.empty() != true && (
                    (gen.back() >= '0' && gen.back() <= '9') ||
                    (gen.back() >= 'a' && gen.back() <= 'z') ||
                    (gen.back() >= 'A' && gen.back() <= 'Z')))//если последнее, что было в gen - переменная или цифра, 
                    gen.push(';');//то следует поставить ограничивающий знак
                else if(((stk.empty() != true && stk.top() == '(') || gen.empty() == true) && i == '-')//иначе,
                    gen.push('_');//если стек не пуст и последнее, что в него запили была открывающая скобка, либо у нас вообще пока ничего нет, а i == -, то я вставляю знак _
                    //зачем? Ну, для того чтобы все не ломалось при таком вводе: -5 + 3 или 4 * (-2 + 1)
                if(gen.back() != '_')//если последнее в gen не _, которые мы могли только что записать => это какая-то операция
                    stk.push(i);
            }
        }
        else if(i == '(')//если же у нас не цифра, не переменная и не операция, а откр. скобка, то...
        {
            if(gen.empty() != true && (
                (gen.back() >= '0' && gen.back() <= '9') ||
                (gen.back() >= 'a' && gen.back() <= 'z') ||
                (gen.back() >= 'A' && gen.back() <= 'Z')))//если последнее что было в gen - переменная или цифра, 
            {
                gen.push(';');//ставим ограничивающий знак, а в стек записываем *
                stk.push('*');//Опять же, зачем? А затем, чтобы не ставить его самим при записи типа: 23(13 + 1), например
            }
            stk.push(i);//запихиваем ( в стэк
        }
        else if(i == ')')//если же у нас закрылась скобка, следует выгрущить все операции из stk в gen
        {
            while(stk.empty() != true && stk.top() != '(')//пока стек не пустой (если он опустел значит пользователь ввел неправильное выражение) и до, конечно, открывающийся скобки 
            {
                gen.push(stk.top());
                stk.pop();
            }
            if(stk.empty() != true)
                stk.pop();
            else
                throw "WRONG INPUT! Missing (";//кидаем исключение, если пользователь был не очень внимателен
        }
    }
 
    while(stk.empty() != true)//по окончанию работы со строкой в стеке может что-то остаться, потому
    {//выносим все что осталось.
        gen.push(stk.top());
        stk.pop();
    }
    return gen;//и возвращаем результат
}
 
double calc(queue<char> in)
{
    stack<double> res;//временное хранилище значений
    bool minus = false, op = false;//флаги на минус, либо на оперцию
    size_t fl = 0;//переменная для правильного ввода значений с плавающей точкой
    double temp;//и просто временная переменная
 
    res.push(0.0);//добавляем одно значение
    while(in.empty() != true)//пока очередь не опустеет
    {
        if(in.front() == '_')//если встретился знак _, значит был ввод типа: -3 + 2 или 5 * (-4 + 3) и т.д.
        {   
            minus = true;//поднимаем флаг минуса 
            in.pop();//убираем эл.
        }
        else if(in.front() >= '0' && in.front() <= '9')//если получили цифру
        {
            if(op == true) { res.push(0.0); op = false; }//если была какая-то операция и сейчас нам нужно записать новое значение, то добавляем память и опускаем флаг
            while(in.empty() != true && in.front() >= '0' && in.front() <= '9')//пока в очереди что-то есть и пока это цифры
            {
                if((in.front() == '0' && res.top() == 0.0) == false)//чтобы не умножать 0 на 10 и не прибавлять (48 - 48)
                {
                    if(fl == 0)//если не встречалось ., т.е. пока у нас обычное, целое число
                    {
                        res.top() = res.top() * 10 + in.front() - 48;
                    }
                    else//иначе
                    {
                        temp = in.front() - 48;//переводим символьное число в обычное
                        for(size_t i = 0; i < fl; i++)//и по счетчику разряда делим на 10
                            temp /= 10;
                        res.top() += temp;//и просто добавляем к текущему
                        fl++;//увеличиваем разряд
                    }
                }
                in.pop();//убираем эл.
                if(in.empty() != true && in.front() == '.')//если встретилась точка и очередь не пуста, то
                {
                    fl = 1;//счетчик разряда ставим в 1
                    in.pop();//и удаляем .
                }
            }
            fl = 0;//после считывания числа, обнуляем счетчик разрядов
        }
        else if((in.front() >= 'a' && in.front() <= 'z') || (in.front() >= 'A' && in.front() <= 'Z'))//если же нам встретилась переменная
            {
                cout << "Please enter the variable \'";//просим пользователя её ввести
                do
                {//выводим название переменной. А выводим в цикле за тем, чтобы можно было писать переменные не в одну букву
                    cout << in.front();
                    in.pop();
                }while(in.empty() != true && (in.front() >= 'a' && in.front() <= 'z') || (in.front() >= 'A' && in.front() <= 'Z'));
                cout << "\': ";
                if(op == true) { res.push(0.0); op = false;}//если до этого была операция, а теперь нам нужно ввести новое значение, то выделяем память
                cin >> res.top();//вводим значение переменной с клавиатуры
            }
            else if(in.front() == ';' ||
                    in.front() == '+' || in.front() == '-' ||
                    in.front() == '*' || in.front() == '/')//если же нам наконец попалась операция
            {
                if(minus == true)//если флаг минуса поднят
                {
                    minus = false;//опускаем флаг
                    res.top() = -res.top();//умножаем текущее значение на -1
                }
                if(in.front() == ';')//если это знак разделитель, значит надо добавить памяти
                {
                    res.push(0.0);//добавляем 
                    in.pop();//убираем знак
                }
                else if(res.size() > 1)//иначе, если у нас уже что-то есть в стеке
                {
                    temp = res.top();//пихаем в temp последнее значение
                    res.pop();//убираем его из стека
                    switch(in.front())//смотрим что это и делаем необходимые операции
                    {
                        case '+':
                            res.top() += temp;
                            break;
                        case '-':
                            res.top() -= temp;
                            break;
                        case '*':
                            res.top() *= temp;
                            break;
                        case '/':
                            res.top() /= temp;
                            break;
                    }
                    op = true;//ставим флаг операции
                    in.pop();//убираем символ операции из очереди
                }
            }
    }
    if(res.size() > 1)//если вдруг в стеке осталось что-то кроме результата, выводим сообщение об ошибке и все, что осталось в стеке
    {
        cout << "something went wrong!";
        while(res.empty() != true)
        {
            cout << res.top() << ' ';
            res.pop();
        }
        return 0.0;
    }
    return res.top();//если же все хорошо, возвращаем результат
}
 
template <class T>
ostream& operator<<(ostream& out, queue<T> cs)
{
    while(cs.empty() != true)
    {
        out << cs.front();
        cs.pop();
    }
    return out;
}
 
int main()
{
    string in;
    queue<char> gen;
    cout << "Enter an expression:\n";
    getline(cin, in);
 
    gen = to_revpol(in);
    cout << "Result of the function to_revpol: " << gen << endl;
    cout << "Final result: " << calc(gen);
    return end();
}


Вернуться к обсуждению:
Обратная польская запись C++
2
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2018, 22:44
Готовые ответы и решения:

Обратная польская запись
Что такое обратная польская запись и как её реализовать на С++? Почему когда в программе я пишу...

Обратная польская запись
Простите что не совсем в том разделе, просто его больше всего людей посещает) По теме: Как при...

Обратная польская запись
В обратной польской записи, которую также называют постфиксной, операция записывается после двух...

Обратная польская запись
Помогите написать программу для вычисления обратной польской записи, использовав стек. Например,...

7
02.06.2018, 22:44
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2018, 22:44
Помогаю со студенческими работами здесь

Обратная польская запись
Нужно создать класс с++ для вычисления обратной польской записи с помощь стека.

Обратная польская запись
Добрый день, подскажите, как будет выглядеть обратная польская запись для for (i=0;i&lt;n;i++){...

Обратная польская запись
Пожалуйста помогите, всю голову себе сломал. Задание: &quot;Обеспечить перевод инфиксного выражения в...

Обратная польская запись
Подскажите, как по обратной польской записи выражения построить дерево выражения Например:...

0
Новые блоги и статьи
Откуда у float лишние цифры в конце дробной части. Представление чисел с плавающей точкой
bytestream 25.01.2025
При разработке программного обеспечения часто возникает необходимость работать с вещественными числами, которые содержат дробную часть. В современных компьютерных системах такие числа представляются. . .
Как использовать глобальную переменную в функции в Python
bytestream 25.01.2025
В программировании на Python глобальные переменные представляют собой особый тип переменных, которые доступны для использования во всех частях программы, включая различные функции, классы и модули. . . .
Как в цикле обойти все элементы map в Java
bytestream 25.01.2025
В разработке на Java одной из наиболее востребованных структур данных является интерфейс Map, который предоставляет эффективный способ хранения и управления парами "ключ-значение". Разработчики. . .
Для чего нужен UserManager.isU­serAGoat(­) в Android и как это использовать
bytestream 25.01.2025
В мире Android-разработки существует множество интересных и порой загадочных функций, о которых знают далеко не все разработчики. Одной из таких функций является метод UserManager. isUserAGoat(),. . .
Как обойти масси в JavaScript. Всё о циклах
bytestream 25.01.2025
JavaScript представляет собой мощный язык программирования, широко используемый в веб-разработке, где массивы и циклы являются фундаментальными концепциями для эффективной работы с данными. Массив в. . .
Как сделать, чтобы существующая ветка отслеживала удалённую в Git. Связывание локальных и удалённых веток
bytestream 25.01.2025
В разработке программного обеспечения системы контроля версий стали неотъемлемой частью процесса создания качественного программного продукта. Эти инструменты позволяют разработчикам эффективно. . .
Как проверить, что файл НЕ существует с помощью Bash
bytestream 25.01.2025
В системном администрировании проверка существования файлов является фундаментальной операцией, особенно при написании скриптов на Bash. Правильная обработка ситуаций, когда файл отсутствует,. . .
Как проверить, что строка пустая, неопределена или null в JavaScript
bytestream 25.01.2025
При разработке веб-приложений на JavaScript разработчики регулярно сталкиваются с необходимостью проверки строковых значений на различные состояния. Валидация данных является критически важным. . .
Как проверить существование ключа в объекте или массиве в JavaScript
bytestream 25.01.2025
При разработке веб-приложений на JavaScript программисты постоянно сталкиваются с необходимостью работать с объектами и массивами. Эти структуры данных являются фундаментальными элементами языка и. . .
Как создать ArrayList из массива (array) в Java
bytestream 25.01.2025
При разработке программного обеспечения на языке Java программисты часто сталкиваются с необходимостью эффективного управления наборами данных. Массивы и ArrayList являются двумя фундаментальными. . .
Как сгенерировать случайные целые числа (int) в указанном диапазоне в Java
bytestream 25.01.2025
В программировании генерация случайных чисел является важнейшим инструментом для решения множества практических задач. От создания игровых механик до реализации алгоритмов машинного обучения, от. . .
Как сделать, чтобы grep выводил строки до и после найденной
hw_wired 25.01.2025
Утилита grep стала незаменимым инструментом для поиска и фильтрации информации в Unix-подобных операционных системах. Эта командная утилита позволяет осуществлять поиск строк, соответствующих. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru