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

стек в STL - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.85
nick07x
2 / 2 / 0
Регистрация: 21.03.2011
Сообщений: 55
22.05.2011, 10:19     стек в STL #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
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?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
22.05.2011, 10:21     стек в STL #2
То, что вы используете, стеком тяжело назвать. Скорее это вектор.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
22.05.2011, 10:24     стек в STL #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;
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.05.2011, 13:03     стек в STL #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;
}
nick07x
2 / 2 / 0
Регистрация: 21.03.2011
Сообщений: 55
22.05.2011, 15:54  [ТС]     стек в STL #5
Nameless One спасибо, но это слишком сложная программа((
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.05.2011, 16:00     стек в STL #6
nick07x, Ничего сложного. Нужно всего-лишь почитать книжки.
nick07x
2 / 2 / 0
Регистрация: 21.03.2011
Сообщений: 55
22.05.2011, 17:44  [ТС]     стек в STL #7
может быть, но лабораторную так защитить не получится
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.05.2011, 18:02     стек в STL #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;
}
Печать стека, надеюсь, сделаешь сам
nick07x
2 / 2 / 0
Регистрация: 21.03.2011
Сообщений: 55
23.05.2011, 05:34  [ТС]     стек в STL #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>());
}
а можете комментарии в этом фрагменте добавить?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
23.05.2011, 05:46     стек в STL #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>());
}
nick07x
2 / 2 / 0
Регистрация: 21.03.2011
Сообщений: 55
23.05.2011, 06:42  [ТС]     стек в STL #11
спасибо. а как сделать чтобы стек не мог иметь более 2 элементов, то есть чтобы умножить второй раз надо было удалить 2 множитель и добавить новый?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
23.05.2011, 08:27     стек в STL #12
nick07x, у стека есть метод size(), который возвращает размер (число элементов) стека. Т.е. при добавлении нужно проверять, не равен ли уже размер стека 2. Если равен, то выдать сообщение об ошибке, в противном случае произвести добавление.
Только, ИМХО, использовать стек для перемножения только двух чисел - это лишняя трата ресурсов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2011, 18:11     стек в STL
Еще ссылки по теме:

Структура стек (: добавить элемент в стек, удалить элемент из стека, получить значение с вершины стека, размер стека...) C++
C++ stl, перемещение элемента из вектора в стек
Переменные в стеке. Где хранятся? Как обрабатываются? Есть ли программный стек или только стек процессора? C++

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

Или воспользуйтесь поиском по форуму:
nick07x
2 / 2 / 0
Регистрация: 21.03.2011
Сообщений: 55
23.05.2011, 18:11  [ТС]     стек в STL #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;
}
Yandex
Объявления
23.05.2011, 18:11     стек в STL
Ответ Создать тему
Опции темы

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