Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
reisal78
676 / 588 / 139
Регистрация: 28.04.2013
Сообщений: 1,675
#1

Класс стек - C++

12.08.2013, 22:55. Просмотров 1103. Ответов 14
Метки нет (Все метки)

Доброго времени!

Читаю книгу Р. Лафоре - Объектно-ориентированное программирование С++.

В теме: "Массивы как члены классов" приведен такой пример:

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
// stakaray.cpp
// класс стек
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class Stack
{
  private:
    enum { MAX = 10 }; // немного нестандартный синтаксис
    int st [ MAX ];    // стек в виде массива
    int top;           // вершина стека
  public:
    Stack ( ) // конструктор
      { top = 0; }
    void push ( int var ) // поместить в стек
      { st [ ++top ] = var; }
    int pop ( ) // взять из стека
      { return st [ top-- ]; }
};
///////////////////////////////////////////////////////////
int main ( )
{
  Stack s1;
 
  s1.push ( 11 );
  s1.push ( 22 );
  cout << "1: " << s1.pop ( ) << endl;
  cout << "2: " << s1.pop ( ) << endl;
  s1.push ( 33 );
  s1.push ( 44 );
  s1.push ( 55 );
  s1.push ( 66 );
  cout << "3: " << s1.pop ( ) << endl;
  cout << "4: " << s1.pop ( ) << endl;
  cout << "5: " << s1.pop ( ) << endl;
  cout << "6: " << s1.pop ( ) << endl;
  return 0;
}
Как это работает - вопросов не вызывает. Вопрос - для чего вообще может понадобиться подобный класс? В каких случаях может быть использован данный "приём"?

Заранее спасибо! =)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2013, 22:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс стек (C++):

Класс Стек Stack. не работает класс исключений - C++
Здравствуйте! Решил проверить код на пригодность, но почему то класс исключений выскакивает на ошибке. Я никак не могу понять такие вещи...

Стек через класс - C++
Не всекаю где проблема, после создания new_el, значения стека p по переменной fam меняются. Задача такова: создать отсортированный список...

Шаблонный класс Стек - C++
прошу помочь разобраться с кодом. вопросы выделил по ходу кода. #ifndef _STACKNODE_H_ #define _STACKNODE_H_ #include &lt;string&gt; ...

Класс, реализующий стек - C++
Помогите девушке, только учусь программировать и чет пока не очень=( плиииииииииииииииииииииииииз кого не затруднит...... Задание 5....

Класс стек, рекурсия, - C++
задача - реализовать стек через класс, все основные функции со стеком, и самое главное, рекурсивную функцию, которая выводит стек в...

Определить класс стек - C++
Определить класс стек. В класс включить два конструктора для определе-ния стека по его размеру и путем копирования другого стека. ...

14
alex1392
31 / 31 / 3
Регистрация: 24.07.2013
Сообщений: 187
12.08.2013, 23:21 #2
Яб сказал так ! Это скорее пример и служит он по большей части для того чтобы тот кто в нем разобрался стал лудши понимать принцип работы стека и при необходимости в будущем мог написать свой стек естественно более сложный и всеобьемлющий
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
13.08.2013, 01:28 #3
Цитата Сообщение от reisal78 Посмотреть сообщение
Вопрос - для чего вообще может понадобиться подобный класс?
например, для проверки баланса скобок в арифметическом выражении
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
#include <iostream>
#include <stack>
#include <string>
 
bool check_brackets(const std::string &expr)
{
    std::stack<char> brackets;
 
    for (auto c : expr)
        if ( c == '(' || c == '{' || c == '[' )
            brackets.push(c);
        else
            switch ( c ) {
                case ')':
                    if (!brackets.empty() && brackets.top() == '(')
                        brackets.pop();
                    else return false;
                    break;
                case '}':
                    if (!brackets.empty() && brackets.top() == '{')
                        brackets.pop();
                    else return false;
                    break;
                case ']':
                    if (!brackets.empty() && brackets.top() == '[')
                        brackets.pop();
                    else return false;
                    break;
            }
    return brackets.empty();
}
 
int main()
{
    std::string expr;
    std::getline(std::cin,expr);
    if (check_brackets(expr)) std::cout << "ok";
    else std::cout << "no ok";
    return 0;
}
2
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
13.08.2013, 10:13 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Olivеr, дополню с вашего позволения.
Для вычисления арифметических выражений- обратная польская запись( ОПЗ). Если надо, могу привести код.

Добавлено через 53 секунды
Подсчёт производных. Вообщем для вычисления любого вырожения сложнее a+b)
3
reisal78
676 / 588 / 139
Регистрация: 28.04.2013
Сообщений: 1,675
13.08.2013, 10:40  [ТС] #5
Спасибо! Понял.
0
fatalis
8 / 8 / 1
Регистрация: 09.08.2013
Сообщений: 68
13.08.2013, 17:35 #6
Стек весьма полезная структура данных,может использоваться для симуляции рекурсии.
Конечно,подобная,реализация абсолютно бесполезная,обычно стек строится на связном списке
0
zer0mail
2374 / 2004 / 199
Регистрация: 03.07.2012
Сообщений: 7,197
Записей в блоге: 1
13.08.2013, 18:00 #7
Почему бесполезная? Можно использовать "связный список массивов", что даст и скорость и емкость.
0
fatalis
8 / 8 / 1
Регистрация: 09.08.2013
Сообщений: 68
14.08.2013, 14:35 #8
"Связный список массивов" это вы где такую структуру вычитали?
0
Wolkodav
605 / 458 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
14.08.2013, 14:47 #9
fatalis, это кто вам рассказал, что эмуляция рекурсии бесполезна? Ткните мне пальцем...
Скорее всего zer0mail имеел ввиду, в виде массива, обычного.
0
fatalis
8 / 8 / 1
Регистрация: 09.08.2013
Сообщений: 68
14.08.2013, 16:54 #10
Где я,например,написал,что эмуляция рекурсии бесполезная?
Читать надо внимательней.
0
UriahHeep
222 / 217 / 41
Регистрация: 24.09.2012
Сообщений: 509
Записей в блоге: 2
14.08.2013, 17:30 #11
Цитата Сообщение от reisal78 Посмотреть сообщение
C++
st [ ++top ] = var;
Так вы пропускаете нулевой элемент массива и помещая MAX-ый элемент в стек вы выходите за пределы выделенной памяти.
0
zer0mail
2374 / 2004 / 199
Регистрация: 03.07.2012
Сообщений: 7,197
Записей в блоге: 1
14.08.2013, 17:36 #12
Цитата Сообщение от fatalis Посмотреть сообщение
"Связный список массивов" это вы где такую структуру вычитали?
А что, можно использовать только структуры, которые прочитал? Вот связный список массивов:
C
1
2
3
4
struct LM {
    LM *next;
    int *m;
};
на базе которого нетрудно сделать экономичный быстрый стек.
0
salam
171 / 152 / 16
Регистрация: 10.07.2012
Сообщений: 751
14.08.2013, 17:41 #13
стек - полезная структура при решении задач. только в данном случае, как раз гораздо удобнее стек на массиве. в графовых задачах часто нужен. есть люди, которые могут с помощью него очень много решать задач.
0
fatalis
8 / 8 / 1
Регистрация: 09.08.2013
Сообщений: 68
14.08.2013, 23:25 #14
Цитата Сообщение от zer0mail Посмотреть сообщение
А что, можно использовать только структуры, которые прочитал? Вот связный список массивов:
C
1
2
3
4
struct LM {
    LM *next;
    int *m;
};
на базе которого нетрудно сделать экономичный быстрый стек.
Экономичный быстрый стек делается простым связным списком
C++
1
2
3
4
5
template<class T> struct node
{
 T elem;
 Node *next;
}
0
zer0mail
2374 / 2004 / 199
Регистрация: 03.07.2012
Сообщений: 7,197
Записей в блоге: 1
15.08.2013, 07:57 #15
Чего это он быстрый-то? При миллионах вставок/удалений в секунду надо постоянно выделять - освобождать память. Так что массив легко выигрывает у списка...
0
15.08.2013, 07:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2013, 07:57
Привет! Вот еще темы с ответами:

Стек указателей на класс-интерфейс - C++
Задача такая: есть иерархия. Интерфейс -&gt; абстрактный базовый класс -&gt; два наследника и у них ещё по два. Имеется 4 вектора с элементами...

Класс, реализующий стек точек - C++
описание класса ,реализующего стек точек R2(int ,int) очень нужно,плиииз

Описать класс, реализующий стек - C++
Всем привет, нуждаюсь в помощи. Описать класс, реализующий стек. Написать программу, использующую этот класс для моделирования...

Написать класс, реализующий Стек - C++
Написать класс, реализующий стек или очередь (что указано в задании). В классе описать соответствующие методы (push, pop и т.д.). В...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru