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

стек в STL - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Создать класс Triangle для представления треугольника. Поля данных должны включать углы и стороны. http://www.cyberforum.ru/cpp-beginners/thread301604.html
Создать класс Triangle для представления треугольника. Поля данных должны включать углы и стороны. Требуется реализовать операции: получения и изменения полей данных, вычисления площади, вычисление периметра, вычисление высот, а также определения вида треугольника (равносторонний, равнобедренный или прямоугольный). необходимо реализовать в том или ином виде определение нового класса
C++ организовать цикл дано слово ch="sdf" Как сделать, чтобы ch просматривался целым словом, а не посимвольно. for(i=0;i<=3;i++){ if (!strcmp(ch,argv))) {cout<<"0";} } http://www.cyberforum.ru/cpp-beginners/thread301602.html
Как создавать dll? C++
как создавать dll по типу //инклуды #ifdef __cplusplus extern "C" { #endif // константы
Диф уравнения второго порядка C++
Всем доброго здоровья. проблема в том что не могу освоить численное решение диф. уравнений второго порядка, из за того что не знаю численные методы решения систем уравнений, решение протых уравнений освоил на отлично. В общем кто может поделитесь пожалуйста примерчиком, или хотя бы примерчиком решения систем уравнения методом(Зейделя или Гаусса), а привести к системе я уже смогу сам. Заранее...
C++ Функции C++ turbo http://www.cyberforum.ru/cpp-beginners/thread301575.html
Даны 2 одномерных массива,в каждом массиве надо найти количество элементов,кратных 5. Подскажите пожалуйста функцию нахождения кол-ва элементов,кратных 5. Треугольник задан координатами вершин. Найти периметр треугольника. Описать функцию нахождения расстояния между двумя точками. Добавлено через 49 секунд Заранее благодарен...
C++ Массив,строки,символы. Помогите пожалуйста решить 3 задачки на C++ турбо,пожалуйста,очень надо,скоро экзамен. 1. Дана строка символов. Если первый и последний символы строки равны, то последний символ удалить. 2. Даны сведения об авто: фамилия владельца, марка, цвет, год выпуска: 1) Найти фамилии владельцев, у которых белые «Жигули». 2) Найти самый старый автомобиль. 3) Найти марки машин, выпущенных после 2000... подробнее

Показать сообщение отдельно
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
22.05.2011, 13:03     стек в STL
Вот 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;
}
 
Текущее время: 17:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru