1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
1

Создание стека структур

22.04.2013, 22:45. Показов 10055. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как мне объявить стек структур с помощью <stack> ? Я создал структуру и хотел сделать стек таких структур, но почему-то у меня не получается =( Взгляните сами:
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
#include <iostream>
#include <stack>
 
using namespace std;
 
const int N=100;
 
struct Football
 {
     char fio[10];
     int vozrast;
     int kol_gollov=0;
     double vremya=0;
     char legioner[3];
     double plata=0;
 };
stack <Football> football;
 
int main()
{
    cout<<"Vvedite familiu imya otchestvo"<<endl;
    cin>>Football.fio;
    cout<<"Vozrast"<<endl;
    cin>>football.vozrast;
    cout<<"Kollichestvo golov"<<endl;
    cin>>football.kol_gollov;
    cout<<"Vremya"<<endl;
    cin>>football.vremya;
    cout<<"Yavlyaentsya legionerom? (yes/no)"<<endl;
    cin>>football.legioner;
    cout<<"Zar_plata"<<endl;
    cin>>football.plata;
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2013, 22:45
Ответы с готовыми решениями:

Обработка структур с использованием стека
Выбрать предметную область для «базы данных» в соответствии с номером в групповом журнале и...

Создание стека
Никак не могу справится с одним заданием, начала писать код, а дальше никак толкового ничего не...

Создание стека
Создать стек,чтобы он вмещал 10 чисел. Подскажите как это сделать.

Создание стека
Дано число N ( &gt;0 ) и набор N из чисел. Создать стек, содержащий исходные числа (последнее число...

37
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
22.04.2013, 22:54 2
ququ_smile, нужно создавать объекты типа Football, инициализировать их (лучше создать функцию для ввода информации и вывода), и потом уже класть в стек.
0
1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
22.04.2013, 23:01  [ТС] 3
Цитата Сообщение от yoghurt92 Посмотреть сообщение
ququ_smile, нужно создавать объекты типа Football, инициализировать их (лучше создать функцию для ввода информации и вывода), и потом уже класть в стек.
Я так пытался делать, но у меня почему-то не получалось =( можете показать пример?
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
22.04.2013, 23:08 4
ququ_smile, смотрите, создаете внутри структуры 2 функции, для ввода и вывода, потом в менйе как-то так

C++
1
2
3
4
5
for(int i = 0; i < 5; ++i)
       Football op;
       op.Input();                       //это функция ввода
       football.push(op);
}
0
1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
22.04.2013, 23:36  [ТС] 5
Цитата Сообщение от yoghurt92 Посмотреть сообщение
ququ_smile, смотрите, создаете внутри структуры 2 функции, для ввода и вывода, потом в менйе как-то так

C++
1
2
3
4
5
for(int i = 0; i < 5; ++i)
       Football op;
       op.Input();                       //это функция ввода
       football.push(op);
}
эм... что-то мозг не варит )) можно это изобразить без функции ввода? Т.е. голый ввод одного поля струкруты
З.Ы. а 5 - это значит что мы введем 5 полей структуры или 5 структур, состоящих из одного поля?
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
23.04.2013, 15:36 6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

ququ_smile,

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
#include <iostream>
#include <string>
#include <queue>
using namespace std;
 
#define size 2
 
struct Football{
    string fio,
           legioner;
 
    int vozrast,
        kol_gollov;
 
    double vremya,
           plata;
 
    //а вот те функции о которых я говорил
    void input(){
        cout << "Vvedite familiu imya otchestvo: ";
            cin >> fio;
        cout << "Vozrast: ";
            cin >> vozrast;
        cout << "Kollichestvo golov: ";
            cin >> kol_gollov;
        cout << "Vremya: ";
            cin >> vremya;
        cout << "Yavlyaentsya legionerom? (yes/no): ";
            cin >> legioner;
        cout << "Zar_plata: ";
            cin >> plata;
        cout << endl;
    }
 
    //и эта тоже
    void output(){
        cout << "\nVvedite familiu imya otchestvo" << fio;
        cout << "\nVozrast" << vozrast;
        cout << "\nKollichestvo golov" << kol_gollov;
        cout << "\nVremya" << vremya;
        cout << "\nYavlyaentsya legionerom? (yes/no)" << legioner;
        cout << "\nZar_plata" << plata << '\n';
    }
};
 
int main()
{
    queue<Football> coll;
 
    //вот ввод данных
    for(int i = 0; i < size; ++i){
        Football op;                //создаем объек структуры
        op.input();                 //вводим данные 
        coll.push(op);              //кладем в стек
    }
 
    //вот вывод данных
    for(int i = 0; i < size; ++i){
        coll.front().output();          //выводим верхний
        coll.push(coll.front());        //добавляем верхний d rjytw
        coll.pop();                     //удаляем верхний
    }
 
    cout << "\n\n";
    return 0;
}
если честно, то твой выбор контейнера не удачный, т.к. ты не сможешь просмотреть что в нем храниться, стек реализует политику LIFO, поэтому просмотреть его не удалив все содержимое при этом не получится. Я взял очередь, т.к. она реализует политику FIFO, с ней конечно тоже проблемы, но по крайней мере можно удалять первый и добавлять его в конец, в итоге таких манипуляций ты просмотришь очередь и сохранишь все на месте. А лучше взять вектор, для твоей задачи он подходит лучше всего.
0
1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
23.04.2013, 17:26  [ТС] 7
Цитата Сообщение от yoghurt92 Посмотреть сообщение
если честно, то твой выбор контейнера не удачный, т.к. ты не сможешь просмотреть что в нем храниться, стек реализует политику LIFO, поэтому просмотреть его не удалив все содержимое при этом не получится. Я взял очередь, т.к. она реализует политику FIFO, с ней конечно тоже проблемы, но по крайней мере можно удалять первый и добавлять его в конец, в итоге таких манипуляций ты просмотришь очередь и сохранишь все на месте. А лучше взять вектор, для твоей задачи он подходит лучше всего.
я сам этому не рад, но в курсаче мне сказали сделать таблицу из структур в форме стека =( До конца сам не понимаю как мне всё это реализовать, но пока-что я просто не могу разобраться со стеком =( Ты показал как работать с очередью, но не мог бы ты показать тот же пример, но со стеком?
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
23.04.2013, 17:28 8
ququ_smile, могу, но тогда если нужно вывести стек придется удалять его содержимое, иначе никак...
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
23.04.2013, 17:30 9
ququ_smile,
C++
1
 queue<Football> coll;
исправьте на
C++
1
stack<Football> coll;
C++
1
coll.front().output();
на
C++
1
 coll.top().output();
Остальное, вроде, не поменяется.

Добавлено через 1 минуту
yoghurt92, а вы и так в очереди поудаляли. Кстати, вы не правы, если идти по итераторам можно без удаления вывести в 1 проход.
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
23.04.2013, 17:50 10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Ternsip, буду рад если вы покажите, потому что я новичок в STL, но про begin и end у stack не знаю...

Добавлено через 4 минуты
Ternsip, нет, не получиться вашим способом, мы же добавляем верхушку и удаляем, только так

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
#include <iostream>
#include <string>
#include <stack>
#include <algorithm>
using namespace std;
 
#define size 2
 
struct Football{
    string fio,
           legioner;
 
    int vozrast,
        kol_gollov;
 
    double vremya,
           plata;
 
    //а вот те функции о которых я говорил
    void input(){
        cout << "Vvedite familiu imya otchestvo: ";
            cin >> fio;
        cout << "Vozrast: ";
            cin >> vozrast;
        cout << "Kollichestvo golov: ";
            cin >> kol_gollov;
        cout << "Vremya: ";
            cin >> vremya;
        cout << "Yavlyaentsya legionerom? (yes/no): ";
            cin >> legioner;
        cout << "Zar_plata: ";
            cin >> plata;
        cout << endl;
    }
 
    //и эта тоже
    void output(){
        cout << "\nVvedite familiu imya otchestvo" << fio;
        cout << "\nVozrast" << vozrast;
        cout << "\nKollichestvo golov" << kol_gollov;
        cout << "\nVremya" << vremya;
        cout << "\nYavlyaentsya legionerom? (yes/no)" << legioner;
        cout << "\nZar_plata" << plata << '\n';
    }
};
 
int main()
{
    stack<Football> coll;
 
    //вот ввод данных
    for(int i = 0; i < size; ++i){
        Football op;                //создаем объек структуры
        op.input();                 //вводим данные 
        coll.push(op);              //кладем в стек
    }
 
    //вот вывод данных
    for(int i = 0; i < size; ++i){
        coll.top().output();           //выводим верхний
        coll.pop();                     //удаляем верхний
    }
 
    cout << "\n\n";
    return 0;
}
это мой вариант, если Ternsip покажет лучше, буду рад посмотреть, самому интересно

Добавлено через 10 минут
ququ_smile, я тут подумал, а что если воспользоваться не STL а самому написать стек, и потом уже реализовать для него функцию вывода без удаления?
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
23.04.2013, 18:20 11
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

yoghurt92, можно можно вот :
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
#include <iostream>
#include <set>
#include <vector>
#include <limits>
#include <queue>
#include <stdio.h>
#include <string>
 
using namespace std;
 
template <typename E>
class Tstack{
public:
    struct stack{
        E inf;
        stack *next;
    };
    stack *head;
    Tstack(){
        head =  NULL;
    }
    void push(E x){
        stack *st = new stack;
        st->inf = x;
        st->next = head;
        head = st;
    }
    bool empty(){
        return !head;
    }
    E pop(){
        if (empty()) 
            return 0;
        stack *nhead = head;
        int c = head->inf;
        head = nhead->next;
        delete nhead;
        return c;
    }
    void show(){
        stack *st = head;
        while (st) {
            cout << st->inf << " ";
            st = st->next;
        }
    }
}; 
 
 
int main(){            
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    Tstack <int> omfg;
    omfg.push(777);
    omfg.push(666);
    omfg.push(333);
    omfg.push(131313);
    omfg.push(4242);
    omfg.show();
    return 0;
}
По средствам STL, может, тоже возможно такое сделать.
0
1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
23.04.2013, 18:22  [ТС] 12
Цитата Сообщение от yoghurt92 Посмотреть сообщение
я тут подумал, а что если воспользоваться не STL а самому написать стек, и потом уже реализовать для него функцию вывода без удаления?
Т.е. создать массив структур и обращаться с ним как со стеком, но со своими функциями?
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
23.04.2013, 18:27 13
ququ_smile, вовсе нет! для того чтобы пользоваться стеком структур вам нужно у стека указать тип вот так :
C++
1
stack < название вашей структуры > имя переменной
теперь вы можете обратиться к вашему элементу, например, вот так
C++
1
имя переменной . top(). метод вашей структуры
Но этот элемент будет лежать на верхушке стека.
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
23.04.2013, 18:28 14
ququ_smile, нет, как Ternsip показал, средствами STL без удаления я не знаю способа. Да скорее всего его и нет)


Ternsip, да, так можно, а STL-ая реализация не позволяет выводить без удаления.
0
1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
23.04.2013, 18:29  [ТС] 15
Ternsip

В нашей методичке по стекам (правда это методичка к лабе) библиотеки <stack> и в помине нет)) все функции написаны вручную, но мне это как-то не нравится...
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
23.04.2013, 18:32 16
ququ_smile, ну почему не нравится, есть возможность заточить стек под себя, а не уповать на STL реализацию)
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
23.04.2013, 18:35 17
ququ_smile, посмотрите мой пост чуть-чуть повыше, я там описал класс стек и его достаточно, чтобы осуществить то, что я уже говорил.

Добавлено через 1 минуту
возможно ещё понадобится метод top()
0
1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
23.04.2013, 18:41  [ТС] 18
Цитата Сообщение от yoghurt92 Посмотреть сообщение
ну почему не нравится, есть возможность заточить стек под себя, а не уповать на STL реализацию)
Я вообще сначала сделал под динамический массив, где всё просто, а потом узнал что мне нужен стек =( Теперь почти все методы есть, а вот под стек как-то геморойно переделывать=(
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
23.04.2013, 18:45 19
ququ_smile, ну лучше вариант это вручную написать, да и опыт работы с указателями будет, так что Ternsip показал вам правильный путь, держитесь этого курса)
0
1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
23.04.2013, 19:06  [ТС] 20
Цитата Сообщение от yoghurt92 Посмотреть сообщение
ququ_smile, ну лучше вариант это вручную написать, да и опыт работы с указателями будет, так что Ternsip показал вам правильный путь, держитесь этого курса)
Я, чесно говоря, не всё понимаю, что написал Ternsip =( да и с классами я особо еще не знакомился...
0
23.04.2013, 19:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2013, 19:06
Помогаю со студенческими работами здесь

создание стека
Люди помогите не могу создать стек проблема в том что нельзя использовать классы и сижу как дурак...

Создание универсального стека
Прошу помощи в создании универсального стека. Вообще в реализации стека хранящего определенный тип...

Задача на создание стека
Задача состоит в том, чтобы создать стек через массив.

Создание стека и проверка на палиндром
Вроде как правильные функции создание и извлечение из стека, но дальше путаюсь с указателями....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru