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

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

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

стек в STL - C++

22.05.2011, 10:19. Просмотров 2546. Ответов 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?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2011, 10:19     стек в STL
Посмотрите здесь:

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

STL - C++
std::vector&lt;char*&gt; files; Объясните пожалуйста как правильно заполнять такой вектор

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

STL - C++
Всем привет :) Задача следующая - Нужно считать из файла строки, запихнуть их в стек и вывести на экран, чтобы перед ними был номер...

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

STL - C++
Блин нарорд... я затупил по жоскому.... у меня std::vector, пытаюсь добавить элемент на n-e место: using namecpace std; ...

STL в С++ - C++
Нужна помощь! Дана строка, состоящая из русских слов, разделенных пробелами (одним или несколькими). Определить количество слов, которые...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
22.05.2011, 10:21     стек в STL #2
То, что вы используете, стеком тяжело назвать. Скорее это вектор.
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
Еще ссылки по теме:

STL - C++
Доброго времени суток! Возникли трудности с пониманием задачи и принципа работы программы. Задание следующее: &quot;Разработать программу -...

STL - C++
Задача: сторонами треугольников и прямоугольников являются цветные (red, green, blue) lego-палстины с соответствующим количеством узлов....

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

Книга по STL - C++
Всем привет! Хотелось бы изучить STL, но не знаю какую книгу купить. Джосьютиса уже нет в продаже.Видел вот эту...

STL multimap. - C++
#include &quot;stdafx.h&quot; #include &lt;map&gt; #include &lt;algorithm&gt; #include &lt;string&gt; #include &quot;conio.h&quot; #include &lt;iostream&gt; using...


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

Или воспользуйтесь поиском по форуму:
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
Ответ Создать тему
Опции темы

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