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

Класс стека - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
yuliyayuliya28
3 / 3 / 0
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 21:49     Класс стека #1
Здравствуйте!помогите создать класс стека, чтобы входные данные были из списка....как я понимаю, это должно быть в конструкторе или нет? и правильно ли я пытаюсь реализовать?
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2012, 21:49     Класс стека
Посмотрите здесь:

C++ Класс стека
C++ Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
C++ Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода и вывода элементов стека. Ввести эталонный символ.
C++ Основы ООП. Создание стека через класс
Структура стек (: добавить элемент в стек, удалить элемент из стека, получить значение с вершины стека, размер стека...) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 22:05     Класс стека #2
Что-то не понятно, что твои push и pop делают, и зачем в них передавать int top.
push должен добавлять новый элемент в стек, а pop - удалять верхний элемент, у тебя судя по всему все наоборот.
yuliyayuliya28
3 / 3 / 0
Регистрация: 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;
}
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 22:27     Класс стека #4
А из какого списка входные данные? std::list?
Не передавайте параметр int top ни в одну из функций, у вас есть такое поле в классе, top которое и так доступно из методов класса.
yuliyayuliya28
3 / 3 / 0
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 22:29  [ТС]     Класс стека #5
Цитата Сообщение от Герц Посмотреть сообщение
А из какого списка входные данные? std::list?
Не передавайте параметр int top ни в одну из функций, у вас есть такое поле в классе, top которое и так доступно из методов класса.
я не правильно выразилась из списка чисел например 123456 в файле.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 22:43     Класс стека #6
Я бы загрузил данные из списка, а стеку передал их в виде массива, например.
Не нужно вносить такую логику как "чтение значений из файла" внутрь класса, являющегося простым контейнером этих данных. В крайнем случае можно сделать обобщенный метод "чтения значений из потока".
yuliyayuliya28
3 / 3 / 0
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 22:46  [ТС]     Класс стека #7
Цитата Сообщение от Герц Посмотреть сообщение
Я бы загрузил данные из списка, а стеку передал их в виде массива, например.
Не нужно вносить такую логику как "чтение значений из файла" внутрь класса, являющегося простым контейнером этих данных. В крайнем случае можно сделать обобщенный метод "чтения значений из потока".
А ен могли бы показать как это будет выглядеть?
как написать метод вывода из файла и занесения в массив?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 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;
}
yuliyayuliya28
3 / 3 / 0
Регистрация: 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;
}
Не всё понятно....а какие будут конструкторы у класса?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 23:32     Класс стека #10
Я же описал оба констуктора в коде
yuliyayuliya28
3 / 3 / 0
Регистрация: 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;
}
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 23:54     Класс стека #12
А вы не пробовали определять конструктор в самом классе? :-)
yuliyayuliya28
3 / 3 / 0
Регистрация: 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;
}
к сожалению и так не заработало(
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
15.09.2012, 00:31     Класс стека #14
Я не экстрасенс, хоть бы вывод компилятора написали.
У меня как минимум все компилируется, а у Вас все методы класса private, к тому же точки с запятой нет на конце определения класса.
#include <list>1111111
Это тоже не самым благоприятным образом сказывается на успешности компиляции.
yuliyayuliya28
3 / 3 / 0
Регистрация: 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>
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
15.09.2012, 00:53     Класс стека #16
Замени 'not' на '!'. В остальном там все понятно, и уже описано в моем предыдущем сообщении.
yuliyayuliya28
3 / 3 / 0
Регистрация: 06.03.2011
Сообщений: 319
15.09.2012, 01:02  [ТС]     Класс стека #17
Цитата Сообщение от Герц Посмотреть сообщение
Замени 'not' на '!'. В остальном там все понятно, и уже описано в моем предыдущем сообщении.
Вы волшебник заработала...а в к этой строке создётся объект stack stck( elementList ); так?только к нему пуш и поп не заработают ведь..
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
15.09.2012, 01:12     Класс стека #18
Создается объект stack под именем stck, конструктору в качестве параметра передается список элементов в стеке, эти элементы автоматом загоняются в стек.
Почему не заработают?
DU
1477 / 1053 / 45
Регистрация: 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); // используем имеющуюся функцию.
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2012, 02:04     Класс стека
Еще ссылки по теме:

Создать класс для работы со стеком. Элемент стека – действительное число C++
Удалить элемент из стека по условию и добавить элемент в начало стека C++
Класс итератор для стека C++

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

Или воспользуйтесь поиском по форуму:
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
15.09.2012, 02:04     Класс стека #20
Задача была сформулирована как "загрузить стек из списка", а это её точное решение.
И если уж делать конструктор со списком, то лучше использовать готовые функции в самом же стеке, а то ведь переданный список может оказаться больше максимального размера стека. т.е.:
Как-то не очень круто вызывать push в конструкторе, а если push будет виртуальной?
Yandex
Объявления
15.09.2012, 02:04     Класс стека
Ответ Создать тему
Опции темы

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