Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 36
1

Стек и выражение в ОПЗ

03.11.2019, 19:50. Показов 3514. Ответов 6

Привет. Сижу учу С++,пишу,разбираю коды. Тырю какие-то вещи кое-где,вроде работает. Осталось правильно понять.
Так вот,может кто помочь с понимаем тех или иных строк кода ниже?
Интересует,как звучит на словах условия цикла в 16 строке. Немного недопонимаю смысл условия.
И 20 - 29 строки. Просто минимально объяснить. Так-то я в принципе понимаю код. Просто может кто пояснить,пожалуйста?

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
#include <iostream>
#include <stack>
#include <sstream>
using namespace std;
 
int main() 
{
    std::string str;
    std::getline(std::cin, str);
    std::istringstream s(str);
    stack<int> stc;
    int value;
    char sign;
    while (!s.eof())
        {
            while (s >> value) 
        {
            stc.push(value);
        }
        if (!s.eof())
        {
            s.clear();
            s.unget();
            s >> sign;
        
                int first = stc.top();
                stc.pop();
                int second = stc.top();
                stc.pop();
 
            switch (sign) 
            {
            case '+':   stc.push(first + second); break;
            case '-':   stc.push(first - second); break;
            case '*':   stc.push(first * second); break;
            case '/':   stc.push(first / second); break;
            default:
                cout << "Wrong operator" << sign << endl;
            return 0;
            }
        }
    }
    cout << "Result:" << stc.top() << endl;
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2019, 19:50
Ответы с готовыми решениями:

ОПЗ и стек
Здравствуйте, нужна помощь при реализации ОПЗ, чтобы при запуске консольной прог первый элемент...

Стек. Логическое выражение
Задали задачу: Но я ни как не могу понять как к ней подступиться. Получается здесь будет...

Используя стек, вычислить следующее выражение
7+3х+3y+3c+xyc #include &lt;iostream.h&gt; /*НАША СТРУКТУРА*/ struct List { int x;...

Односвязный список. Вычислить логическое выражение используя стек
Форум,прошу помощи.Задание такое: Дан текстовый файл. Используя стек, вычислить значение...

6
Don't worry, be happy
17249 / 10118 / 1958
Регистрация: 27.09.2012
Сообщений: 25,319
Записей в блоге: 1
03.11.2019, 19:53 2
Лучший ответ Сообщение было отмечено Hikaharu как решение

Решение

Цитата Сообщение от Hikaharu Посмотреть сообщение
Интересует,как звучит на словах условия цикла в 16 строке.
Пока считывание из s в value успешно, выполняем тело цикла.
1
"C with Classes"
1507 / 1303 / 492
Регистрация: 16.08.2014
Сообщений: 5,462
Записей в блоге: 1
03.11.2019, 19:54 3
Цитата Сообщение от Hikaharu Посмотреть сообщение
Просто может кто пояснить,пожалуйста?
надеюсь твой пытливый мозг разберется с этим
и помни, плохих учителей не бывает, бывают плохие ученики.
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 36
03.11.2019, 20:29  [ТС] 4
Спасибо,многое я знаю. Или я так думаю. Просто неправильно понимаю,вот и пытаюсь разобраться)
Почитаю,если вы про ресурс в целом. О заголовке я знаю.

Добавлено через 2 минуты
Еще вот вопрос остался насчет 20-24 строк.
С условием понятно - если строка не пуста,то. А вот что "то",я не до конца понимаю.
Дальше я понимаю,что оно из стека операнд берет,а потом чистит его.

Добавлено через 28 минут
C++
1
2
3
4
5
if (!s.eof())
        {
            s.clear();
            s.unget();
            s >> sign;
Вот тут я не понимаю просто немного. Если строка не пуста,то она отчищается и в строковой поток возвращается последний прочитанный символ (Этому есть объяснение немного попроще?). После символы операторов из s считываются в переменную sigh. Верно?
0
"C with Classes"
1507 / 1303 / 492
Регистрация: 16.08.2014
Сообщений: 5,462
Записей в блоге: 1
03.11.2019, 20:47 5
Лучший ответ Сообщение было отмечено Hikaharu как решение

Решение

Hikaharu,
C++
1
2
3
4
5
if (!s.eof() ) // если в потоке остались символы
{
    s.clear(); // сбрасываем ошибки
    s.unget(); // возврат позиции в потоке на одну позицию назад
    s >> sign; // читаем один символ из потока
учись читать документацию, добрый совет, твоя стратегия обучения ошибочна.
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 36
03.11.2019, 20:51  [ТС] 6
Я понимаю,но это костыль, т.к. в универе внезапно решили вставить С++. Сижу в спешке разбираюсь специально для лаб,к которым методического или любого другого материала не дают.
Это так поверхностно. Для более глубокого понимания буду разбираться в этом,спасибо за помощь.
0
2733 / 1892 / 564
Регистрация: 05.06.2014
Сообщений: 5,525
03.11.2019, 22:34 7
Лучший ответ Сообщение было отмечено Hikaharu как решение

Решение

Цитата Сообщение от Hikaharu Посмотреть сообщение
И 20 - 29 строки. Просто минимально объяснить. Так-то я в принципе понимаю код. Просто может кто пояснить,пожалуйста?
Вообще говоря, ваш вопрос сам по себе является исчерпывающим ответом - "что это такое и зачем оно надо?". Читаем из потока строку, из этой строки делаем поток, читаем из потока строку еще раз... Ой, ё. STL-контейнеры в этой задаче опять же избыточны. Зачем они тут, защищаться от переполнения стека? Так за стеком то никто не следит - "+" на вход и получим UB с pop() на пустом стеке. Как оно должно примерно выглядеть (чуть длиннее, так как с контролем ошибок):
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
#include <iostream>
#include<vector>
#include<exception>
 
int main()
{
    const std::size_t stackSize=1024;
    int stackStorage[stackSize];
    int*stackTop=stackStorage;
    while(true)
    {
        //получение первого непробельного символа
        while(std::cin.peek()==' ')
            std::cin.get();
        const int nonspaceChar=std::cin.peek();
 
        //если первый символ - цифра, из потока читается число и идет в стек
        if(nonspaceChar>='0' && nonspaceChar<='9')
        {
            if(stackTop==stackStorage+stackSize)
                throw std::runtime_error("stack overflow");
            std::cin>>*stackTop++;
        }
        //если первый символ - конец строки, печать результата
        else if(nonspaceChar=='\n')
        {
            if(stackTop!=stackStorage+1)
                throw std::runtime_error("wrong expression");
            std::cout<<*--stackTop<<std::endl;
            break;
        }else
        {
            //иначе ожидается код оператора с двумя аргументами.
            //Кстати, а эти два аргумента в стеке вообще есть?
            if(stackTop<stackStorage+2)
                throw std::runtime_error("wrong expression");
            const int second=*--stackTop;
            const int first=*--stackTop;
 
            //чтение кода оператора
            switch(std::cin.get())
            {
            case'+':
                *stackTop++=first+second;
                break;
            case'-':
                *stackTop++=first-second;
                break;
            case'*':
                *stackTop++=first*second;
                break;
            case'/':
                *stackTop++=first/second;
                break;
            default:
                //хз что пользователь хотел ввести, но программа этого не понимает
                throw std::runtime_error("wrong expression");
            }
        }
    }
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2019, 22:34

Используя стек, определить функцию, которая переводит выражение в префиксную форму
Есть задание - Используя стек, определить функцию, которая переводит выражение, записанное в...

ОПЗ
Всем привет! При Реализации алгоритма Обраттной польской нотации проблем не возникло, а вот когда...

ОПЗ в C++
Добрый день! Поставили передо мной задачу, написать программу которая считает выражение в обратной...

ОПЗ
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { string str, stack,...


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

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

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