4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
1

Класс стека

14.09.2012, 21:49. Показов 4488. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!помогите создать класс стека, чтобы входные данные были из списка....как я понимаю, это должно быть в конструкторе или нет? и правильно ли я пытаюсь реализовать?
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
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
 
const int maxlen =100;
 
class stack
{
    int s[maxlen];
    int top;
    void pop(int top, int x);
    void push(int top);
    bool empty(int top);
    stack();
    stack(int top);
}
stack::stack()
{
    top=0;
}
stack::stack(int top)
 
 void stack::pop(int top,int x){
     if (top=maxlen) cout<<"Cтек полон"<<endl;
     s[top]=x;
    top++;
 }
 void stack::push(int top)
 { if (top==0) cout<<"Стек пуст"<<endl;
   top--;
 }
 bool stack::empty (int top)
 {
     if (top==0) return 1;
     else return 0;
 }
 
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.09.2012, 21:49
Ответы с готовыми решениями:

Класс стека
нужна помаш в написание одной программы(задачи) вот сама задача: Задание: Реализовать и...

Класс итератор для стека
Доброго времени суток! Обращаюсь к вам за помощью. Хоть сама в тему эту не совсем влилась,...

Основы ООП. Создание стека через класс
Приветствую всех пользователей форума. Относительно недавно начал осваивать ООП. Было необходимо...

Создать класс для работы со стеком. Элемент стека – действительное число
Создать класс для работы со стеком. Элемент стека – действительное число. Применить класс для...

21
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 22:05 2
Что-то не понятно, что твои push и pop делают, и зачем в них передавать int top.
push должен добавлять новый элемент в стек, а pop - удалять верхний элемент, у тебя судя по всему все наоборот.
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 22:08  [ТС] 3
Цитата Сообщение от Герц Посмотреть сообщение
Что-то не понятно, что твои push и pop делают, и зачем в них передавать int top.
push должен добавлять новый элемент в стек, а pop - удалять верхний элемент, у тебя судя по всему все наоборот.
Спасибо я перепутала, мне очень сложно даётся пытаюсь разобраться но пока не очень поулчается



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
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
 
const int maxlen =100;
 
class stack
{
    int s[maxlen];
    int top;
    void push(int top, int x);
    void pop(int top);
    bool empty(int top);
    stack();
    stack(int top);
}
stack::stack()
{
    top=0;
}
stack::stack(int top)
 
 void stack::push(int top,int x){
     if (top=maxlen) cout<<"Cтек полон"<<endl;
     s[top]=x;
    top++;
 }
 void stack::pop(int top)
 { if (top==0) cout<<"Стек пуст"<<endl;
   top--;
 }
 bool stack::empty (int top)
 {
     if (top==0) return 1;
     else return 0;
 }
 
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 22:27 4
А из какого списка входные данные? std::list?
Не передавайте параметр int top ни в одну из функций, у вас есть такое поле в классе, top которое и так доступно из методов класса.
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 22:29  [ТС] 5
Цитата Сообщение от Герц Посмотреть сообщение
А из какого списка входные данные? std::list?
Не передавайте параметр int top ни в одну из функций, у вас есть такое поле в классе, top которое и так доступно из методов класса.
я не правильно выразилась из списка чисел например 123456 в файле.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 22:43 6
Я бы загрузил данные из списка, а стеку передал их в виде массива, например.
Не нужно вносить такую логику как "чтение значений из файла" внутрь класса, являющегося простым контейнером этих данных. В крайнем случае можно сделать обобщенный метод "чтения значений из потока".
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 22:46  [ТС] 7
Цитата Сообщение от Герц Посмотреть сообщение
Я бы загрузил данные из списка, а стеку передал их в виде массива, например.
Не нужно вносить такую логику как "чтение значений из файла" внутрь класса, являющегося простым контейнером этих данных. В крайнем случае можно сделать обобщенный метод "чтения значений из потока".
А ен могли бы показать как это будет выглядеть?
как написать метод вывода из файла и занесения в массив?
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 22:57 8
Занесение в стек из массива - как-то так:
C++
1
2
3
4
5
6
stack::stack( const int* data, int length )
{
    for ( top = 0; top < length; ++top ) {
        s[ top ] = data[ top ];
    }
}
Но вообще лучше использовать какой-нибудь std::vector< int >, std::list< int >.
Загрузка из файла - либо нужно указывать в начале файла, сколько в нем хранится элементов, либо сразу пользоваться стандартным контейнером, чтобы не мучаться с перевыделением памяти под массив.
Я бы сделал так:
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 <fstream>
#include <list>
 
stack::stack( const std::list< int >& elst )
: top( 0 )
{
    for ( std::list< int >::const_iterator it = elst.begin(); it != elst.end(); ++it ) {
        s[ top++ ] = *it;
    }
}
 
int main()
{
    std::ifstream file( "stack-data.txt" );
 
    if ( not file.is_open() ) {
        return 0;
    }
 
    std::list< int > elementList;
 
    while ( not file.eof() ) {
        int tmp;
        file >> tmp;
        elementList.push_back( tmp );
    }
 
    stack stck( elementList );
 
    //  Работа со стеком
 
    return 0;
}
Хотя, учитывая что у вас есть maxlen == 100, можно при чтении создавать временный массив автоматический с размером 100, и читать из файла пока есть что читать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    std::ifstream file( "stack-data.txt" );
 
    if ( not file.is_open() ) {
        return 0;
    }
 
    int tmpData[ 100 ];
    int tmpLen = 0;
 
    while ( not file.eof() ) {
        file >> tmpData[ tmpLen++ ];
    }
 
    stack stck( tmpData, tmpLen );
 
    //  Работа со стеком
 
    return 0;
}
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 23:25  [ТС] 9
Цитата Сообщение от Герц Посмотреть сообщение
Занесение в стек из массива - как-то так:
C++
1
2
3
4
5
6
stack::stack( const int* data, int length )
{
    for ( top = 0; top < length; ++top ) {
        s[ top ] = data[ top ];
    }
}
Но вообще лучше использовать какой-нибудь std::vector< int >, std::list< int >.
Загрузка из файла - либо нужно указывать в начале файла, сколько в нем хранится элементов, либо сразу пользоваться стандартным контейнером, чтобы не мучаться с перевыделением памяти под массив.
Я бы сделал так:
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 <fstream>
#include <list>
 
stack::stack( const std::list< int >& elst )
: top( 0 )
{
    for ( std::list< int >::const_iterator it = elst.begin(); it != elst.end(); ++it ) {
        s[ top++ ] = *it;
    }
}
 
int main()
{
    std::ifstream file( "stack-data.txt" );
 
    if ( not file.is_open() ) {
        return 0;
    }
 
    std::list< int > elementList;
 
    while ( not file.eof() ) {
        int tmp;
        file >> tmp;
        elementList.push_back( tmp );
    }
 
    stack stck( elementList );
 
    //  Работа со стеком
 
    return 0;
}
Хотя, учитывая что у вас есть maxlen == 100, можно при чтении создавать временный массив автоматический с размером 100, и читать из файла пока есть что читать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    std::ifstream file( "stack-data.txt" );
 
    if ( not file.is_open() ) {
        return 0;
    }
 
    int tmpData[ 100 ];
    int tmpLen = 0;
 
    while ( not file.eof() ) {
        file >> tmpData[ tmpLen++ ];
    }
 
    stack stck( tmpData, tmpLen );
 
    //  Работа со стеком
 
    return 0;
}
Не всё понятно....а какие будут конструкторы у класса?
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 23:32 10
Я же описал оба констуктора в коде
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 23:43  [ТС] 11
Цитата Сообщение от Герц Посмотреть сообщение
Я же описал оба констуктора в коде
Не работает(

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
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <list>
 
using namespace std;
 
const int maxlen =100;
 
class stack
{
    int s[maxlen];
    int top;
    void pop(int top, int x);
    void push(int top);
    bool empty(int top);
    stack();
    stack(int top);
 
}
 
 void stack::pop(int top,int x){
     if (top=maxlen) cout<<"Cтек полон"<<endl;
     s[top]=x;
    top++;
 }
 void stack::push(int top)
 { if (top==0) cout<<"Стек пуст"<<endl;
   top--;
 }
 bool stack::empty (int top)
 {
     if (top==0) return 1;
     else return 0;
 }
 
 
stack::stack( const std::list< int >& elst )
: top( 0 )
{
    for ( std::list< int >::const_iterator it = elst.begin(); it != elst.end(); ++it ) {
        s[ top++ ] = *it;
    }
}
 
int main()
{
    std::ifstream file( "stack-data.txt" );
 
    if ( not file.is_open() ) {
        return 0;
    }
 
    std::list< int > elementList;
 
    while ( not file.eof() ) {
        int tmp;
        file >> tmp;
        elementList.push_back( tmp );
    }
 
    stack stck( elementList );
 
 
    return 0;
}
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 23:54 12
А вы не пробовали определять конструктор в самом классе? :-)
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
15.09.2012, 00:29  [ТС] 13
Цитата Сообщение от Герц Посмотреть сообщение
А вы не пробовали определять конструктор в самом классе? :-)
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
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <list>1111111
 
using namespace std;
 
const int maxlen =100;
 
class stack
{
    int s[maxlen];
    int top;
 
 
 void pop(int top,int x)
 {
     if (top=maxlen) cout<<"Cтек полон"<<endl;
     s[top]=x;
    top++;
 }
 void push(int top)
 { if (top==0) cout<<"Стек пуст"<<endl;
   top--;
 }
 bool empty (int top)
 {
     if (top==0) return 1;
     else return 0;
 }
 
 
stack( const std::list< int >& elst )
: top( 0 )
{
    for ( std::list< int >::const_iterator it = elst.begin(); it != elst.end(); ++it ) {
        s[ top++ ] = *it;
    }
}
 
}
 
int main()
{
    std::ifstream file( "stack-data.txt" );
 
    if ( not file.is_open() ) {
        return 0;
    }
 
    std::list< int > elementList;
 
    while ( not file.eof() ) {
        int tmp;
        file >> tmp;
        elementList.push_back( tmp );
    }
 
    stack stck( elementList );
 
 
    return 0;
}
к сожалению и так не заработало(
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
15.09.2012, 00:31 14
Я не экстрасенс, хоть бы вывод компилятора написали.
У меня как минимум все компилируется, а у Вас все методы класса private, к тому же точки с запятой нет на конце определения класса.
#include <list>1111111
Это тоже не самым благоприятным образом сказывается на успешности компиляции.
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
15.09.2012, 00:36  [ТС] 15
Цитата Сообщение от Герц Посмотреть сообщение
Я не экстрасенс, хоть бы вывод компилятора написали.
У меня как минимум все компилируется, а у Вас все методы класса private, к тому же точки с запятой нет на конце определения класса.

Это тоже не самым благоприятным образом сказывается на успешности компиляции.
1>------ Построение начато: проект: Stack, Конфигурация: Debug Win32 ------
1>Построение начато 15.09.2012 0:32:17.
1>InitializeBuildStatus:
1> Обращение к "Debug\Stack.unsuccessfulbuild".
1>ClCompile:
1> Для всех выходных данных обновления не требуется.
1> Stack.cpp
1>c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(51): error C2065: not: необъявленный идентификатор
1>c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(51): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "file"
1>c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(51): error C2059: синтаксическая ошибка: )
1>c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(51): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(57): error C2065: not: необъявленный идентификатор
1>c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(57): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "file"
1>c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(57): error C2059: синтаксическая ошибка: )
1>c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(57): error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(63): error C2248: stack::stack: невозможно обратиться к private член, объявленному в классе "stack"
1> c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(37): см. объявление "stack::stack"
1> c:\users\юлька\documents\visual studio 2010\projects\stack\stack\stack.cpp(15): см. объявление "stack"
1>
1>СБОЙ построения.
1>
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
15.09.2012, 00:53 16
Замени 'not' на '!'. В остальном там все понятно, и уже описано в моем предыдущем сообщении.
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
15.09.2012, 01:02  [ТС] 17
Цитата Сообщение от Герц Посмотреть сообщение
Замени 'not' на '!'. В остальном там все понятно, и уже описано в моем предыдущем сообщении.
Вы волшебник заработала...а в к этой строке создётся объект stack stck( elementList ); так?только к нему пуш и поп не заработают ведь..
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
15.09.2012, 01:12 18
Создается объект stack под именем stck, конструктору в качестве параметра передается список элементов в стеке, эти элементы автоматом загоняются в стек.
Почему не заработают?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
15.09.2012, 01:50 19
как-то странно выглядит такой код:
C++
1
2
3
4
5
6
7
8
9
    std::list< int > elementList;
 
    while ( not file.eof() ) {
        int tmp;
        file >> tmp;
        elementList.push_back( tmp );
    }
 
    stack stck( elementList );
зачем тут посредник в виде std::list?

C++
1
2
3
4
5
6
    stack stck; //  тут у стека должен быть дефолтный конструктор, что вполне естественно для стека
    while ( not file.eof() ) {
        int tmp = 0;
        file >> tmp;
        stck.push( tmp );
    }
И если уж делать конструктор со списком, то лучше использовать готовые функции в самом же стеке, а то ведь переданный список может оказаться больше максимального размера стека. т.е.:

C++
1
2
3
4
5
6
7
stack( const std::list< int >& elst )
: top( 0 )
{
    for ( std::list< int >::const_iterator it = elst.begin(); it != elst.end(); ++it ) {
        push(*it); // используем имеющуюся функцию.
    }
}
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
15.09.2012, 02:04 20
Задача была сформулирована как "загрузить стек из списка", а это её точное решение.
И если уж делать конструктор со списком, то лучше использовать готовые функции в самом же стеке, а то ведь переданный список может оказаться больше максимального размера стека. т.е.:
Как-то не очень круто вызывать push в конструкторе, а если push будет виртуальной?
0
15.09.2012, 02:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2012, 02:04
Помогаю со студенческими работами здесь

Создать класс, для хранения стека чисел – списка, организованного по принципу LIFO
Создать класс, для хранения стека чисел – списка, организованного по принципу LIFO (последним...

Структура стек (: добавить элемент в стек, удалить элемент из стека, получить значение с вершины стека, размер стека...)
Всем привет,ребят помогите пожалуйста с лабой,вообще без понятия про стеки:( Может кто то...

Класс "Динамический массив", переполнение стека
Проблема заключается в переполнение стека, как грамотно присвоить указателю значение нового...

Удалить элемент из стека по условию и добавить элемент в начало стека
Здравствуйте, помогите пожалуйста исправить(дописать) программы. 1). Нужно удалить элемент,...


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

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

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