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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.85
nick07x
3 / 3 / 0
Регистрация: 21.03.2011
Сообщений: 55
#1

стек в STL - C++

22.05.2011, 10:19. Просмотров 2637. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2011, 10:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос стек в STL (C++):

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

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

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

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

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

при работе рекурсивной функции заканчивается стек и программа соответственно; как сделать так, чтобы она писала "стек закончился"? - C++
Сабж g++ 4.5.0

12
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
22.05.2011, 10:21 #2
То, что вы используете, стеком тяжело назвать. Скорее это вектор.
0
ValeryLaptev
Эксперт С++
1046 / 825 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
22.05.2011, 10:24 #3
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
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
22.05.2011, 13:03 #4
Вот 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
nick07x
3 / 3 / 0
Регистрация: 21.03.2011
Сообщений: 55
22.05.2011, 15:54  [ТС] #5
Nameless One спасибо, но это слишком сложная программа((
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
22.05.2011, 16:00 #6
nick07x, Ничего сложного. Нужно всего-лишь почитать книжки.
0
nick07x
3 / 3 / 0
Регистрация: 21.03.2011
Сообщений: 55
22.05.2011, 17:44  [ТС] #7
может быть, но лабораторную так защитить не получится
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
22.05.2011, 18:02 #8
Можно и попроще сделать (со стандартным стеком):
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
nick07x
3 / 3 / 0
Регистрация: 21.03.2011
Сообщений: 55
23.05.2011, 05:34  [ТС] #9
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
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
23.05.2011, 05:46 #10
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
nick07x
3 / 3 / 0
Регистрация: 21.03.2011
Сообщений: 55
23.05.2011, 06:42  [ТС] #11
спасибо. а как сделать чтобы стек не мог иметь более 2 элементов, то есть чтобы умножить второй раз надо было удалить 2 множитель и добавить новый?
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
23.05.2011, 08:27 #12
nick07x, у стека есть метод size(), который возвращает размер (число элементов) стека. Т.е. при добавлении нужно проверять, не равен ли уже размер стека 2. Если равен, то выдать сообщение об ошибке, в противном случае произвести добавление.
Только, ИМХО, использовать стек для перемножения только двух чисел - это лишняя трата ресурсов.
1
nick07x
3 / 3 / 0
Регистрация: 21.03.2011
Сообщений: 55
23.05.2011, 18:11  [ТС] #13
спасибо всем кто помогал, особенно 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
23.05.2011, 18:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2011, 18:11
Привет! Вот еще темы с ответами:

Структура стек (: добавить элемент в стек, удалить элемент из стека, получить значение с вершины стека, размер стека...) - C++
Всем привет,ребят помогите пожалуйста с лабой,вообще без понятия про стеки:( Может кто то делал,или встречался с таким заданием: ...

STL - C++
Здравствуйте. Ребят пожалуйста решите 2 простенькие задачки, потратьте немного своего времени, очень прошу. Заранее огромное спасибо...

STL - C++
где можно почитать про STL очень подробно что бы исходные коды тоже были, какие структуры данных используются в реализации и тд тд тд ...

STL - C++
где можно посмотреть исходный код STL??


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

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

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