Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
3 / 3 / 3
Регистрация: 21.03.2011
Сообщений: 55

стек в STL

22.05.2011, 10:19. Показов 4588. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include <iostream>
#include <conio.h>
#include <locale>
using namespace std;
 
int ymnojenue(int a, int b)
{
    return a*b;
}
 
void main()
{
    setlocale (LC_ALL, "Russian");
    int stack[2];
    int top, x,y;
    top=0;
 
for(;;)
{
    cout<<"\nВыберете действие:\n1.Добавить множитель\n2.Удалить множитель\n3.Выполнить умножение\n";
cin>>y;
 
switch(y)
{
case 1:
    cout<<"\nВведите ваш множитель: ";
    cin>>x;
 
    if (top <2)
    {
    stack[top]=x;
    top++;
    }
    else
        cout<<"\nОшибка! Стек переполнен!\n";
    for(int i=0; i<top; i++)
        cout<<stack[i]<<" "<<"\n";
break;
 
case 2:
    if(top>0)
    {
        top--;
x=stack[top];
    }
    else
        cout<<"Стек пуст! Добавьте элемент";
    if(top!=0){
    cout<<"Удаляем множитель \n";
for(int i=0; i<top; i++)
        cout<<stack[i]<<" "<<"\n";;
break;
 
case 3:
if(top==1 || top==0)
{
cout<<"\nНельзя выполнить умножение.Добавьте еще один множитель.";
}
else 
for(int i=0; i<1; i++)
cout<<" "<<stack[i]<<"\n*\n"<<" "<<stack[i+1]<<"\n----\n"<<" "<<ymnojenue(stack[i],stack[i+1])<<"\n";
break;
 
}
}
}
 
    getch();
}
В программе реализовано умножение с помощью стека на основе массива. Как переделать программу на основе стека в STL?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.05.2011, 10:19
Ответы с готовыми решениями:

stl, перемещение элемента из вектора в стек
Всем привет. Как переместить из вектора в вектор понятно std::remove_copy_if( vector1.begin(), vector1.end(),...

Реализовать пользовательские классы - дек, стек (LIFO), очередь (FIFO) на базе класса list библиотеки STL
Создать пользовательские классы - дек, стек (LIFO), очередь (FIFO) на базе класса list библиотеки STL. Написать тестирующую программу,...

Используя стек, описать функцию проверяющую, является ли стек пустым
Используя стек, описать функцию проверяющую, является ли стек пустым

12
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
22.05.2011, 10:21
То, что вы используете, стеком тяжело назвать. Скорее это вектор.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
22.05.2011, 10:24
C++
1
2
3
4
5
6
7
8
stack<int> S;
...
int m = 5;
S.push(m);     // -- в стек --
...
S.pop();         // -- из стека --
m = S.top();   // -- копировать вершину стека --
if(S.empty()) cout << "Стек пустой!" << endl;
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.05.2011, 13:03
Вот STL-подобный стек с дополнительной возможностью последовательного просмотра всех элементов стека:
Файл stack.hpp:
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
#ifndef MY_STACK_HPP
#define MY_STACK_HPP
 
#include <deque>
#include <stdexcept>
#include <algorithm>
 
namespace my
{
    // Container должен предоставлять следующие операции:
    // back()
    // push_back()
    // pop_back()
    // begin()
    // end()
    template <class T, class Container = std::deque<T> >
    class stack
    {
    private:
    Container cont;
    size_t sz;
    
    public:
 
    typedef typename Container::value_type value_type;
    typedef typename Container::const_iterator const_iterator;
        
    stack(const Container& rhs = Container());
 
    bool empty() const;
 
    size_t size() const;
 
    value_type& top();
    
    const value_type& top() const;
 
    void pop();
 
    void push(const T&);
 
    const_iterator begin() const;
    const_iterator end() const;
 
    bool operator == (const stack<T, Container>&) const;
    bool operator != (const stack<T, Container>&) const;
    bool operator <  (const stack<T, Container>&) const;
    bool operator >  (const stack<T, Container>&) const;
    bool operator <= (const stack<T, Container>&) const;
    bool operator >= (const stack<T, Container>&) const;
    };
 
    template <class T, class Container>
    stack<T, Container>::stack(const Container& rhs)
    : cont(rhs), sz(0)
    {
    }
 
    template <class T, class Container>
    bool stack<T, Container>::empty() const
    {
    return sz == 0;
    }
 
    template <class T, class Container>
    size_t stack<T, Container>::size() const
    {
    return sz;
    }
 
    template <class T, class Container>
    typename stack<T, Container>::value_type& stack<T, Container>::top()
    {
    if(sz == 0)
        throw std::runtime_error("Стек пуст");
 
    return cont.back();
    }
 
    template <class T, class Container>
    const typename stack<T, Container>::value_type& stack<T, Container>::top() const
    {
    if(sz == 0)
        throw std::runtime_error("Стек пуст");
 
    return cont.back();
    }
 
    template <class T, class Container>
    void stack<T, Container>::pop()
    {
    if(sz == 0)
        throw std::runtime_error("Стек пуст");
 
    --sz;
    cont.pop_back();
    }
 
    template <class T, class Container>
    void stack<T, Container>::push(const T& value)
    {
    ++sz;
    cont.push_back(value);
    }
 
    template <class T, class Container>
    typename stack<T, Container>::const_iterator stack<T, Container>::begin() const
    {
    return cont.begin();
    }
 
    template <class T, class Container>
    typename stack<T, Container>::const_iterator stack<T, Container>::end() const
    {
    return cont.end();
    }
 
    template <class T, class Container>
    bool stack<T, Container>::operator == (const stack<T, Container>& rhs) const
    {
    return std::equal(cont.begin(), cont.end(), rhs.cont.end());
    }
    
 
    template <class T, class Container>
    bool stack<T, Container>::operator != (const stack<T, Container>& rhs) const
    {
    return !(*this == rhs);
    }
    
    template <class T, class Container>
    bool stack<T, Container>::operator <  (const stack<T, Container>& rhs) const
    {
    return std::lexicographical_compare(cont.begin(), cont.end(),
                        rhs.cont.begin(), rhs.cont.end());
    }
    
    template <class T, class Container>
    bool stack<T, Container>::operator >  (const stack<T, Container>& rhs) const
    {
    return rhs < *this;
    }
    
    template <class T, class Container>
    bool stack<T, Container>::operator <= (const stack<T, Container>& rhs) const
    {
    return !(*this > rhs);
    }
    
    template <class T, class Container>
    bool stack<T, Container>::operator >= (const stack<T, Container>& rhs) const
    {
    return !(*this < rhs);
    }
}
 
#endif
Перемножение осуществляется с помощью алгоритма accumulate.
Файл main.cc:
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
#include <iostream>
#include <numeric>
#include <functional>
#include <cstdlib>
#include <iterator>
#include <algorithm>
 
#include "stack.hpp"
 
int main()
{
    my::stack<int> stack;
    
    while(true)
    {
    std::cout << "Стек: [ ";
    std::copy(stack.begin(), stack.end(),
          std::ostream_iterator<int>(std::cout, " "));
    std::cout << "] с размером " << stack.size() << " элемент(ов)" << std::endl;
            
    std::cout << "Выберите действие:" << std::endl
          << "\t1. Добавить множитель" << std::endl
          << "\t2. Удалить множитель" << std::endl
          << "\t3. Выполнить умножение" << std::endl
          << "\t4. Выход" << std::endl << std::endl;
 
    int inum;
    int val;
    
    std::cin >> inum;
 
    switch(inum)
    {
    case 1:
        std::cout << "Введите множитель: ";
        std::cin >> val;
        stack.push(val);
        std::cout << "Добавлен множитель: " << val << std::endl;
        continue;
 
    case 2:
        try
        {
        std::cout << "Удален множитель: " << stack.top() << std::endl;
        stack.pop();
        }
        catch(const std::exception& e)
        {
        std::cerr << "Ошибка: " << e.what() << std::endl;
        }
        
        continue;
 
    case 3:
        if(stack.empty())
        std::cerr << "Стек пуст" << std::endl;
        else
        std::cout << "Произведение равно: "
              << std::accumulate(stack.begin(), stack.end(),
                         1, std::multiplies<int>())
              << std::endl;
        continue;
 
    case 4:
        break;
 
    default:
        std::cerr << "Неизвестная операция: " << inum << std::endl;
        continue;
    }
 
    break;
    }
    
    return 0;
}
2
3 / 3 / 3
Регистрация: 21.03.2011
Сообщений: 55
22.05.2011, 15:54  [ТС]
Nameless One спасибо, но это слишком сложная программа((
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.05.2011, 16:00
nick07x, Ничего сложного. Нужно всего-лишь почитать книжки.
0
3 / 3 / 3
Регистрация: 21.03.2011
Сообщений: 55
22.05.2011, 17:44  [ТС]
может быть, но лабораторную так защитить не получится
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
22.05.2011, 18:02
Можно и попроще сделать (со стандартным стеком):
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
#include <iostream>
#include <numeric>
#include <functional>
#include <cstdlib>
#include <iterator>
#include <algorithm>
 
#include <stack>
 
template <class T, class binop>
T product(std::stack<T> stack, T accum,
      binop op)
{
    while(!stack.empty())
    {
    accum = op(stack.top(), accum);
    stack.pop();
    }
 
    return accum;
}
 
template <class T>
T product(std::stack<T> stack, T accum)
{
    return product(stack, accum, std::multiplies<int>());
}
 
int main()
{
    std::stack<int> stack;
    
    while(true)
    {
    std::cout << "Выберите действие:" << std::endl
          << "\t1. Добавить множитель" << std::endl
          << "\t2. Удалить множитель" << std::endl
          << "\t3. Выполнить умножение" << std::endl
          << "\t4. Выход" << std::endl << std::endl;
 
    int inum;
    int val;
    
    std::cin >> inum;
 
    switch(inum)
    {
    case 1:
        std::cout << "Введите множитель: ";
        std::cin >> val;
        stack.push(val);
        std::cout << "Добавлен множитель: " << val << std::endl;
        continue;
 
    case 2:
        if(stack.empty())
        std::cerr << "Стек пуст" << std::endl;
        else
        {
        std::cout << "Удален множитель: " << stack.top() << std::endl;
        stack.pop();
        }
        
        continue;
 
    case 3:
        if(stack.empty())
        std::cerr << "Стек пуст" << std::endl;
        else
        std::cout << "Произведение равно: "
              << product(stack, 1)
              << std::endl;
        continue;
 
    case 4:
        break;
 
    default:
        std::cerr << "Неизвестная операция: " << inum << std::endl;
        continue;
    }
 
    break;
    }
    
    return 0;
}
Печать стека, надеюсь, сделаешь сам
0
3 / 3 / 3
Регистрация: 21.03.2011
Сообщений: 55
23.05.2011, 05:34  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <class T, class binop>
T product(std::stack<T> stack, T accum,
          binop op)
{
    while(!stack.empty())
    {
        accum = op(stack.top(), accum);
        stack.pop();
    }
 
    return accum;
}
 
template <class T>
T product(std::stack<T> stack, T accum)
{
    return product(stack, accum, std::multiplies<int>());
}
а можете комментарии в этом фрагменте добавить?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.05.2011, 05:46
nick07x, объявляем функцию, которая принимает копию шаблонного стека в качестве параметра, начальное значение-аккумулятор и функциональный объект - бинарную операцию, которая будет применяться к аккумулятору и последовательным элементам стека для накопления промежуточных результатов.
Потом объявляем функцию, которая будет вызывать первую функцию с операцией умножения в качестве функционального объекта.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class T, class binop>
T product(std::stack<T> stack,  // Копия стека
      T accum,      // Аккумулятор
      binop op)     // Бинарная операция
{
    while(!stack.empty())   // Пока стек не пуст
    {
    accum = op(stack.top(), accum); // Вычисляем промежуточный результат
    stack.pop();            // Удаляем элемент из стека
    }
 
    return accum;       // Возвращаем аккумулятор
}
 
template <class T>
T product(std::stack<T> stack, T accum)
{
    // Вызываем product(std::stack<T>, T, binop) с std::multiplies<int>()
    // в качестве функционального объекта
    return product(stack, accum, std::multiplies<int>());
}
1
3 / 3 / 3
Регистрация: 21.03.2011
Сообщений: 55
23.05.2011, 06:42  [ТС]
спасибо. а как сделать чтобы стек не мог иметь более 2 элементов, то есть чтобы умножить второй раз надо было удалить 2 множитель и добавить новый?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.05.2011, 08:27
nick07x, у стека есть метод size(), который возвращает размер (число элементов) стека. Т.е. при добавлении нужно проверять, не равен ли уже размер стека 2. Если равен, то выдать сообщение об ошибке, в противном случае произвести добавление.
Только, ИМХО, использовать стек для перемножения только двух чисел - это лишняя трата ресурсов.
1
3 / 3 / 3
Регистрация: 21.03.2011
Сообщений: 55
23.05.2011, 18:11  [ТС]
спасибо всем кто помогал, особенно Nameless One. вообщем защитил хД.
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
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <stack>
using namespace std;
int main()
{
    
    stack<int> stack;
   setlocale(LC_ALL,"");
   for(;;)
    {
        cout << "Выберите действие:" << endl
                  << "\t1. Добавить множитель" << endl
                  << "\t2. Удалить множитель" << endl
                  << "\t3. Выполнить умножение" << endl
                  << "\t4. Выход" << endl << endl;
 
        int inum;
        int val,x,y;
        
        cin >> inum;
 
        switch(inum)
        {
        case 1:
            if(stack.size()>1)
            {
                cout<<"ошибка. переполнение стека! \n";
            continue;
            }
            else{
            cout << "Введите множитель: ";
            cin >> val;
            stack.push(val);
            cout << "Добавлен множитель: " << val << endl;
            continue;
            }
        case 2:
            
            if(stack.empty())
                cout << "Стек пуст" << endl;
            else
            {
                cout << "Удален множитель: " << stack.top() << endl;
                stack.pop();
            }
            
            continue;
 
        case 3:
            
            if(stack.empty())
                cout << "Стек пуст" << endl;
            else
                cout << "Произведение равно: ";
                         
x=stack.top();
stack.pop();
y=stack.top();
cout<<x*y<<endl;
stack.push(x);
            continue;
 
        case 4:
            break;
 
        default:
            cout << "Неизвестная операция: " << inum << endl;
            continue;
        }
 
        break;
    }
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.05.2011, 18:11
Помогаю со студенческими работами здесь

Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами
Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами #include &lt;iostream&gt; #include...

Заполнить стек 20 случайными числами с интервала [0; -10]. Вывести стек на экран. Изъять из стека каждый четвертый элеме
Заполнить стек 20 случайными числами с интервала . Вывести стек на экран. Изъять из стека каждый четвертый элемент, найти сумму изъятых...

Переменные в стеке. Где хранятся? Как обрабатываются? Есть ли программный стек или только стек процессора?
Есть у меня пробелы в познаниях, хотел бы их устранить. 1. Что такое стек в самом языке С++ ? 2. В какой памяти он хранится и почему...

Сформировать стек из 6 цифр. Вывести стек на экран. Удалить элементы из стека, увеличить каждый из них на единицу и снов
Сформировать стек из 6 цифр. Вывести стек на экран. Удалить элементы из стека, увеличить каждый из них на единицу и снова поместить в стек...

Сформировать стек из N чисел. Найти сумму нечетных чисел из стека. Результат поместить в стек
Здравствуйте. Помогите, пожалуйста, решить задачу: Сформировать стек из N чисел. Найти сумму нечетных чисел из стека. Результат поместить...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru