Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319

Класс стека

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

Студворк — интернет-сервис помощи студентам
Здравствуйте!помогите создать класс стека, чтобы входные данные были из списка....как я понимаю, это должно быть в конструкторе или нет? и правильно ли я пытаюсь реализовать?
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.09.2012, 21:49
Ответы с готовыми решениями:

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

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

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

21
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 22:05
Что-то не понятно, что твои push и pop делают, и зачем в них передавать int top.
push должен добавлять новый элемент в стек, а pop - удалять верхний элемент, у тебя судя по всему все наоборот.
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 22:08  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Что-то не понятно, что твои 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
А из какого списка входные данные? std::list?
Не передавайте параметр int top ни в одну из функций, у вас есть такое поле в классе, top которое и так доступно из методов класса.
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 22:29  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
А из какого списка входные данные? std::list?
Не передавайте параметр int top ни в одну из функций, у вас есть такое поле в классе, top которое и так доступно из методов класса.
я не правильно выразилась из списка чисел например 123456 в файле.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 22:43
Я бы загрузил данные из списка, а стеку передал их в виде массива, например.
Не нужно вносить такую логику как "чтение значений из файла" внутрь класса, являющегося простым контейнером этих данных. В крайнем случае можно сделать обобщенный метод "чтения значений из потока".
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 22:46  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Я бы загрузил данные из списка, а стеку передал их в виде массива, например.
Не нужно вносить такую логику как "чтение значений из файла" внутрь класса, являющегося простым контейнером этих данных. В крайнем случае можно сделать обобщенный метод "чтения значений из потока".
А ен могли бы показать как это будет выглядеть?
как написать метод вывода из файла и занесения в массив?
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
14.09.2012, 22:57
Занесение в стек из массива - как-то так:
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  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Занесение в стек из массива - как-то так:
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
Я же описал оба констуктора в коде
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 23:43  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Я же описал оба констуктора в коде
Не работает(

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
А вы не пробовали определять конструктор в самом классе? :-)
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
15.09.2012, 00:29  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
А вы не пробовали определять конструктор в самом классе? :-)
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
Я не экстрасенс, хоть бы вывод компилятора написали.
У меня как минимум все компилируется, а у Вас все методы класса private, к тому же точки с запятой нет на конце определения класса.
#include <list>1111111
Это тоже не самым благоприятным образом сказывается на успешности компиляции.
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
15.09.2012, 00:36  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Я не экстрасенс, хоть бы вывод компилятора написали.
У меня как минимум все компилируется, а у Вас все методы класса 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
Замени 'not' на '!'. В остальном там все понятно, и уже описано в моем предыдущем сообщении.
1
4 / 4 / 4
Регистрация: 06.03.2011
Сообщений: 319
15.09.2012, 01:02  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Замени 'not' на '!'. В остальном там все понятно, и уже описано в моем предыдущем сообщении.
Вы волшебник заработала...а в к этой строке создётся объект stack stck( elementList ); так?только к нему пуш и поп не заработают ведь..
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
15.09.2012, 01:12
Создается объект stack под именем stck, конструктору в качестве параметра передается список элементов в стеке, эти элементы автоматом загоняются в стек.
Почему не заработают?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
15.09.2012, 01:50
как-то странно выглядит такой код:
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
Задача была сформулирована как "загрузить стек из списка", а это её точное решение.
И если уж делать конструктор со списком, то лучше использовать готовые функции в самом же стеке, а то ведь переданный список может оказаться больше максимального размера стека. т.е.:
Как-то не очень круто вызывать push в конструкторе, а если push будет виртуальной?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.09.2012, 02:04
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru