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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
yuliyayuliya28
4 / 4 / 0
Регистрация: 06.03.2011
Сообщений: 319
#1

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

14.09.2012, 21:49. Просмотров 2386. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2012, 21:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс стека (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 22:05 #2
Что-то не понятно, что твои push и pop делают, и зачем в них передавать int top.
push должен добавлять новый элемент в стек, а pop - удалять верхний элемент, у тебя судя по всему все наоборот.
yuliyayuliya28
4 / 4 / 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;
}
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 22:27 #4
А из какого списка входные данные? std::list?
Не передавайте параметр int top ни в одну из функций, у вас есть такое поле в классе, top которое и так доступно из методов класса.
yuliyayuliya28
4 / 4 / 0
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 22:29  [ТС] #5
Цитата Сообщение от Герц Посмотреть сообщение
А из какого списка входные данные? std::list?
Не передавайте параметр int top ни в одну из функций, у вас есть такое поле в классе, top которое и так доступно из методов класса.
я не правильно выразилась из списка чисел например 123456 в файле.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 22:43 #6
Я бы загрузил данные из списка, а стеку передал их в виде массива, например.
Не нужно вносить такую логику как "чтение значений из файла" внутрь класса, являющегося простым контейнером этих данных. В крайнем случае можно сделать обобщенный метод "чтения значений из потока".
yuliyayuliya28
4 / 4 / 0
Регистрация: 06.03.2011
Сообщений: 319
14.09.2012, 22:46  [ТС] #7
Цитата Сообщение от Герц Посмотреть сообщение
Я бы загрузил данные из списка, а стеку передал их в виде массива, например.
Не нужно вносить такую логику как "чтение значений из файла" внутрь класса, являющегося простым контейнером этих данных. В крайнем случае можно сделать обобщенный метод "чтения значений из потока".
А ен могли бы показать как это будет выглядеть?
как написать метод вывода из файла и занесения в массив?
Герц
524 / 341 / 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
4 / 4 / 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;
}
Не всё понятно....а какие будут конструкторы у класса?
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 23:32 #10
Я же описал оба констуктора в коде
yuliyayuliya28
4 / 4 / 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;
}
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
14.09.2012, 23:54 #12
А вы не пробовали определять конструктор в самом классе? :-)
yuliyayuliya28
4 / 4 / 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;
}
к сожалению и так не заработало(
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
15.09.2012, 00:31 #14
Я не экстрасенс, хоть бы вывод компилятора написали.
У меня как минимум все компилируется, а у Вас все методы класса private, к тому же точки с запятой нет на конце определения класса.
#include <list>1111111
Это тоже не самым благоприятным образом сказывается на успешности компиляции.
yuliyayuliya28
4 / 4 / 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>
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2012, 00:36
Привет! Вот еще темы с ответами:

Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода и вывода элементов стека. Ввести эталонный символ. - C++
Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода и вывода элементов стека. Ввести...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами - C++
Здравствуйте! Никак не могу продумать структуру этой программы. Проходим наследование, но я все равно не знаю, как его здесь применить. Как...

Отдельно класс данных, класс формул и главный класс - C++
Здравствуйте! У меня есть три вопроса. Первый вопрос. Скажите пожалуйста! Правильный ли это подход к созданию приложений :...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.09.2012, 00:36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru