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

STL STACK как с ним работать? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Taburetka
0 / 0 / 0
Регистрация: 06.12.2012
Сообщений: 13
04.01.2014, 23:06     STL STACK как с ним работать? #1
задача такова:
1. Создать объект-контейнер в соответствии с вариантом задания и заполнить его данными, тип которых определяется вариантом задания.
2. Просмотреть контейнер.
3. Изменить контейнер, удалив из него одни элементы и заменив другие.
4. Просмотреть контейнер, используя для доступа к его элементам итераторы.
5. Создать второй контейнер этого же класса и заполнить его данными того же типа, что и первый контейнер.
6. Изменить первый контейнер, удалив из него n элементов после заданного и добавив затем в него все элементы из второго контейнера.
7. Просмотреть первый и второй контейнеры.
контейнер stack , тип float.

Первые 3 задания с горем пополам сделаны:
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
#include "stdafx.h"
#include<iostream>
#include<vector>
#include <deque>
#include <stack>
#include <conio.h>
using namespace std;
 
void progr1()
{ stack <float> S1;
   cout<<"Vvedite kolichestvo elementov stack: "; 
    cin>>n;
    for (int i=0; i<n; i++)
        {       
            cin>>t;
            S1.push(t); 
        }
    vector<int> v;
    while (!S1.empty())     
    {
        cout <<S1.top()<<"  ";   
        v.push_back(S1.top());
        S1.pop();                
    }
    for(int i=v.size()-1; i>=0; --i)  
        S1.push(v[i]);
    S1.pop();
    S1.push(1.2);
    cout<<endl;
}
Можно ли как-то проще выводить стек на экран, и как с помощью итератора(работает ли итератор для стека вообще)?? Подскажите (помогите) пожалуйста как сделать остальные задания?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2014, 23:06     STL STACK как с ним работать?
Посмотрите здесь:

C++ STL vector превратить в stack
C++ Как работать с STL stack
C++ STL stack
Как сделать stl::stack полем класса C++
C++ Есть ли связь между STL-stack и stack - высокопроизводительная память?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alex566
 Аватар для Alex566
240 / 152 / 18
Регистрация: 03.04.2013
Сообщений: 317
05.01.2014, 00:13     STL STACK как с ним работать? #2
Цитата Сообщение от Taburetka Посмотреть сообщение
Можно ли как-то проще выводить стек на экран, и как с помощью итератора
Скорее всего стек такое не умеет. Хотя я попробовал помудрить.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <stack>
#include <iterator>
using namespace std;
 
int main(int argc, char *argv[])
{
    stack<int> st;
    for(unsigned i = 0;i<10;i++)
      st.push(rand()%20+(-10));
    copy(&st.top()-st.size()+1,&st.top()+1,ostream_iterator<int>(cout," "));//Вывод содержимого стека на экран.
    return 0;
}
Taburetka
0 / 0 / 0
Регистрация: 06.12.2012
Сообщений: 13
05.01.2014, 10:09  [ТС]     STL STACK как с ним работать? #3
Спс... А как насчет "удалить n элементов после заданного"? Не знаете как реализовать?
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
05.01.2014, 15:53     STL STACK как с ним работать? #4
Вот, было в лабе такое же задание когда-то, но с deque и long.
Переделать под другой контейнер и другой тип не сложно.
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
#include<iostream>
#include<deque>
#include<algorithm>
#include<ctime>
 
using namespace std;
 
void Output(long e)
{
    cout << e << ' ';
}
 
int main()
{
    srand(time(NULL));
 
    //1. Створити об'єкт-контейнер відповідно до варіанта завдання й заповнити його даними, тип яких визначається варіантом завдання.
    deque<long> c;
    for(int i = 0; i < 10; i++)
    {
        c.push_back(rand() % 100);
        c.push_front(rand() % 100);
    }
 
    //2. Переглянути контейнер.
    cout << "The deque contains" << endl;
    for_each(c.begin(),c.end(),Output);
 
    //3. Змінити контейнер, видаливши з нього одні елементи й замінивши інших.
    deque<long>::iterator i = c.begin();
    int pos = rand() % (c.end() - c.begin());
    i += pos; 
    int n = rand() % (c.end() - i);
    c.erase(i, i + n);
    i = c.begin();
    pos = rand() % (c.end() - c.begin());
    i += pos; 
    c.emplace(i,300);
 
    //4. Переглянути контейнер, використовуючи для доступу до його елементів Ітератори.
    cout << "\nElement " << 300 << " inserted at position " << pos << endl;
    for(i = c.begin();i < c.end(); i++)
    {
        cout << *i << ' ';
    }
 
    //5. Створити другий контейнер цього ж класу й заповнити його даними того ж типу, що й перший контейнер.
    deque<long> d;
    for(int i = 0; i < 20; i++)
        d.push_front(rand() % 100);
    cout << "\nSecond deque\n";
    for_each(d.begin(),d.end(),Output);
 
    //6. Змінити перший контейнер, видаливши з нього n елементів після заданого й додавши потім у нього всі елементи із другого контейнера.
    pos = rand() % c.size();
    n = rand() % (c.size() - pos);
    c.erase(c.begin() + pos, c.begin() + pos + n);
    c.insert(c.end(),d.begin(),d.end());
 
    //7. Переглянути перший і другий контейнери.
    cout << "\nFirst deque after erasing from position " << pos 
        << " to " << pos + n << " and adding elements from first deque\n";
    for_each(c.begin(),c.end(),Output);
 
    cout << "\nSecond deque\n";
    for_each(d.begin(),d.end(),Output);
 
    cout << endl;
 
    system("pause");
    return 0;
}
Alex566
 Аватар для Alex566
240 / 152 / 18
Регистрация: 03.04.2013
Сообщений: 317
05.01.2014, 21:06     STL STACK как с ним работать? #5
AnDrew_LP, стек не содержит функции push_back, push_front, begin, end, erase и не содержит итератора. Вообще такие задания стеками не решаются. Можно взять вектор, лист, дек... Стек это простой контейнер в который можно только записывать элементы, удалять и смотреть последний занесенный.
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
05.01.2014, 22:06     STL STACK как с ним работать? #6
Alex566, да, действительно. Но решение все же есть)
http://www.cplusplus.com/reference/stack/stack/
Оказывается, stack использует стандартные контейнеры, по умолчанию - это deque.
Получить контейнер можно с помощью _Get_container().
Вот, небольшой пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stack>
#include <deque>
#include <iostream>
 
using namespace std;
 
int main()
{
    stack<float,deque<float>> s;
    for(short i = 0; i < 5; i++)
        s.push(i);
    deque<float> d = s._Get_container();
    for(deque<float>::iterator i = d.begin();i < d.end(); i++)
    {
        cout << *i << ' ';
    }
    cout << endl;
    system("pause");
    return 0;
}
Alex566
 Аватар для Alex566
240 / 152 / 18
Регистрация: 03.04.2013
Сообщений: 317
05.01.2014, 22:44     STL STACK как с ним работать? #7
Хм.. Глянул на объявление стека, действительно
C++
1
2
3
template<class _Ty,
    class _Container = deque<_Ty> >
    class stack
и второй параметр шаблона стандартно принимает значение deque<тип первого параметра>.
stack<float,deque<float>> эквивалентно stack<float>
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stack>
#include <deque>
#include <iostream>
#include <iterator>
using namespace std;
 
int main()
{
    stack<float> s;
    for (short i = 0; i < 5; i++)
        s.push(i);
    deque<float> d = s._Get_container();
    copy(d.begin(), d.end(), ostream_iterator<float>(cout, " "));
    cout << endl;
    system("pause");
    return 0;
}
Но здесь не обойтись без использования контейнера deque, а создателю темы по заданию нужно работать с стеком. Хотя другого варианта не вижу.

Добавлено через 4 минуты
Хотя..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stack>
#include <iostream>
#include <iterator>
using namespace std;
 
int main()
{
    stack<float> s;
    for (short i = 0; i < 5; i++)
        s.push(i);
    copy(s._Get_container().begin(), s._Get_container().end(), ostream_iterator<float>(cout, " "));
    cout << endl;
    system("pause");
    return 0;
}
Добавлено через 3 минуты
Ну или
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stack>
#include <iostream>
#include <iterator>
using namespace std;
 
int main()
{
    stack<float> s;
    for (short i = 0; i < 5; i++)
        s.push(i);
    for (deque<float>::const_iterator i = s._Get_container().begin(); i < s._Get_container().end(); i++)
        cout << *i << ' ';
    cout << endl;
    system("pause");
    return 0;
}
Добавлено через 9 минут
Цитата Сообщение от AnDrew_LP Посмотреть сообщение
Но решение все же есть)
Но тогда это решение не поможет организовать удаление, поскольку с помощью _Get_container вы переприсвоили значения стека деку. И удаляемые элементы будут удалятся не с стека, а с нового контейнера дека. А s._Get_container().begin() возвращает константный итератор по которому удаление сделать тоже не выйдет.
Разве что очистить стек, удалить указанные элементы с дека и присвоить их значение стеку.
AnDrew_LP
160 / 162 / 9
Регистрация: 29.05.2010
Сообщений: 435
06.01.2014, 17:22     STL STACK как с ним работать? #8
Цитата Сообщение от Alex566 Посмотреть сообщение
Но тогда это решение не поможет организовать удаление, поскольку с помощью _Get_container вы переприсвоили значения стека деку. И удаляемые элементы будут удалятся не с стека, а с нового контейнера дека. А s._Get_container().begin() возвращает константный итератор по которому удаление сделать тоже не выйдет.
Разве что очистить стек, удалить указанные элементы с дека и присвоить их значение стеку.
А я и не говорил, что это позволит удалять элементы) Я имел в виду вот это
4. Просмотреть контейнер, используя для доступа к его элементам итераторы.
А удалять элементы можно используя только стэк, рекурсивно
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
#include <stack>
#include <deque>
#include <iostream>
 
using namespace std;
 
template<typename T>
void Erase(stack<T>& s, const unsigned int &from, const unsigned int &to, unsigned int current)
{
    if(s.size() == 0) return;
    if(current >= from && current <to)
    {
        s.pop();
        Erase(s, from, to, current + 1);
    }
    else
    {
        T temp = s.top();
        s.pop();
        Erase(s, from, to, current + 1);
        s.push(temp);
    }
}
 
template<typename T>
void Erase(stack<T>& s, const unsigned int first, const unsigned int n)
{
    unsigned int to = s.size() - first;
    unsigned int from = s.size() - first - n;
    if(from >= s.size() || to >= s.size() || from > to) return;
    Erase(s, from, to, 0);
}
 
template<typename T>
void Output(const stack<T>& s)
{
    deque<float> d = s._Get_container();
    for(deque<float>::iterator i = d.begin();i < d.end(); i++)
    {
        cout << *i << ' ';
    }
    cout << endl;
}
 
int main()
{
    stack<float> s;
    for(short i = 0; i < 25; i++)
        s.push(i);
 
    Output(s);
 
    Erase(s,4,7);
 
    Output(s);
 
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2014, 21:11     STL STACK как с ним работать?
Еще ссылки по теме:

реализация stack и dack в STL C++
STACK STL C++
C++ STL stack, не пойму где ошибка

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

Или воспользуйтесь поиском по форуму:
Taburetka
0 / 0 / 0
Регистрация: 06.12.2012
Сообщений: 13
06.01.2014, 21:11  [ТС]     STL STACK как с ним работать? #9
Уточнила задание - оказывается все намного проще)) первый контейнер - это deque, а второй - стек. Тогда получается, все, что нужно было сделать со стеком: заполнить его, переписать все его элементы в очередь и просмотреть

Добавлено через 37 минут
Сделала, работает) спасибо, что подумали над моей коряво поставленной задачей)
Yandex
Объявления
06.01.2014, 21:11     STL STACK как с ним работать?
Ответ Создать тему
Опции темы

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