Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
12.08.2013, 22:55     Класс стек #1
Доброго времени!

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

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

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;
}
Как это работает - вопросов не вызывает. Вопрос - для чего вообще может понадобиться подобный класс? В каких случаях может быть использован данный "приём"?

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

C++ класс, реализующий стек
Класс стек, рекурсия, C++
C++ Стек через класс
Класс Стек Stack. не работает класс исключений C++
C++ Определить класс стек
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex1392
31 / 31 / 3
Регистрация: 24.07.2013
Сообщений: 187
12.08.2013, 23:21     Класс стек #2
Яб сказал так ! Это скорее пример и служит он по большей части для того чтобы тот кто в нем разобрался стал лудши понимать принцип работы стека и при необходимости в будущем мог написать свой стек естественно более сложный и всеобьемлющий
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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;
}
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
13.08.2013, 10:13     Класс стек #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Olivеr, дополню с вашего позволения.
Для вычисления арифметических выражений- обратная польская запись( ОПЗ). Если надо, могу привести код.

Добавлено через 53 секунды
Подсчёт производных. Вообщем для вычисления любого вырожения сложнее a+b)
reisal78
 Аватар для reisal78
603 / 516 / 119
Регистрация: 28.04.2013
Сообщений: 1,451
13.08.2013, 10:40  [ТС]     Класс стек #5
Спасибо! Понял.
fatalis
8 / 8 / 1
Регистрация: 09.08.2013
Сообщений: 68
13.08.2013, 17:35     Класс стек #6
Стек весьма полезная структура данных,может использоваться для симуляции рекурсии.
Конечно,подобная,реализация абсолютно бесполезная,обычно стек строится на связном списке
zer0mail
2188 / 1871 / 187
Регистрация: 03.07.2012
Сообщений: 6,661
Записей в блоге: 1
13.08.2013, 18:00     Класс стек #7
Почему бесполезная? Можно использовать "связный список массивов", что даст и скорость и емкость.
fatalis
8 / 8 / 1
Регистрация: 09.08.2013
Сообщений: 68
14.08.2013, 14:35     Класс стек #8
"Связный список массивов" это вы где такую структуру вычитали?
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
14.08.2013, 14:47     Класс стек #9
fatalis, это кто вам рассказал, что эмуляция рекурсии бесполезна? Ткните мне пальцем...
Скорее всего zer0mail имеел ввиду, в виде массива, обычного.
fatalis
8 / 8 / 1
Регистрация: 09.08.2013
Сообщений: 68
14.08.2013, 16:54     Класс стек #10
Где я,например,написал,что эмуляция рекурсии бесполезная?
Читать надо внимательней.
UriahHeep
 Аватар для UriahHeep
222 / 217 / 41
Регистрация: 24.09.2012
Сообщений: 509
Записей в блоге: 2
14.08.2013, 17:30     Класс стек #11
Цитата Сообщение от reisal78 Посмотреть сообщение
C++
st [ ++top ] = var;
Так вы пропускаете нулевой элемент массива и помещая MAX-ый элемент в стек вы выходите за пределы выделенной памяти.
zer0mail
2188 / 1871 / 187
Регистрация: 03.07.2012
Сообщений: 6,661
Записей в блоге: 1
14.08.2013, 17:36     Класс стек #12
Цитата Сообщение от fatalis Посмотреть сообщение
"Связный список массивов" это вы где такую структуру вычитали?
А что, можно использовать только структуры, которые прочитал? Вот связный список массивов:
C
1
2
3
4
struct LM {
    LM *next;
    int *m;
};
на базе которого нетрудно сделать экономичный быстрый стек.
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
14.08.2013, 17:41     Класс стек #13
стек - полезная структура при решении задач. только в данном случае, как раз гораздо удобнее стек на массиве. в графовых задачах часто нужен. есть люди, которые могут с помощью него очень много решать задач.
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2013, 07:57     Класс стек
Еще ссылки по теме:

C++ Шаблонный класс Стек
Класс стек (работа с файлами) C++
C++ Написать класс, реализующий Стек

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

Или воспользуйтесь поиском по форуму:
zer0mail
2188 / 1871 / 187
Регистрация: 03.07.2012
Сообщений: 6,661
Записей в блоге: 1
15.08.2013, 07:57     Класс стек #15
Чего это он быстрый-то? При миллионах вставок/удалений в секунду надо постоянно выделять - освобождать память. Так что массив легко выигрывает у списка...
Yandex
Объявления
15.08.2013, 07:57     Класс стек
Ответ Создать тему
Опции темы

Текущее время: 06:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru