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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
#1

Определить количество элементов в стеке - C++

01.09.2010, 21:42. Просмотров 2038. Ответов 39
Метки нет (Все метки)

Привет народ.
Подскажите пожалуйста как получить кол-во элементов в стеке?
Я пытаюсь написать функцию выдающую такое значение.
Спасибо.

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
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
 
class MyClass
{
public:
    int Stack1[10];
    int Stack2[10];
     int Top;
 
public:
    MyClass() : Top(0)
    {}
public:
    void Push(int var ,int Stk[10]);
public:
    int Pop();
public:
    int GetNum();
};
 
int MyClass::GetNum()
{
return(Top);
}
 
int MyClass::Pop()
{
    int var = Stack1[Top];
    Top--;
    if(Top < 0)
        Top = 0;
    return(var);
}
 
void MyClass::Push(int var ,int Stk[10])
{
    Stk[Top] = var;
     Top++ ;
     if(Top == 10)
         Top = 9;
}
 
 
int main()
{
    setlocale(LC_CTYPE,"Russian");
    MyClass obj;
 
    cout << "Кол-во элементов в Stack1: " << obj.GetNum() << "\n";
    for(int i = 1;i <=10;i++)
    {
        obj.Push(i ,obj.Stack1);
    }
    cout << "Кол-во элементов в Stack1 после вызова функции Push(): " << obj.GetNum() << "\n";
    cout << "Элементы извлеченные из Stack1: " << "\n";
    for(int i = 0;i < 10;i++)
    {
        cout << obj.Pop() << "  ";
    }
    cout << "\n";
    cout << "Кол-во элементов в Stack1: " << obj.GetNum() << "\n";
    
    _getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2010, 21:42     Определить количество элементов в стеке
Посмотрите здесь:

C++ В массиве A из N элементов (N не больше 30) определить количество элементов, имеющих четные значения, и сумму этих элементов.
В массиве А(n) (n<=7) хотя бы один нуль. Определить количество положительных и количество отрицательных элементов к первому нулю. C++
C++ Определить количество нулевых элементов, количество элементов в интервале от 5 до 10
Определить количество отрицательных элементов, количество элементов в интервале от 1 до 5 C++
C++ Инициализация, добавление и удаление элементов в СТЕКЕ
Дан массив целых чисел. Определить количество четных элементов и количество элементов, оканчивающихся на цифру 5 C++
C++ количество четных элементов одномерного массива до числа равному а, Определить количество нечетных элементов двумерного массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5765 / 3414 / 255
Регистрация: 08.02.2010
Сообщений: 7,432
02.09.2010, 18:09     Определить количество элементов в стеке #21
Цитата Сообщение от NikolaWhite Посмотреть сообщение
Осталось назначить для каждого объекта свой размер массива.... я всяко перепробовал.
Буду очень признателен.
а вот с этого места поподробнее. Что конкретно подразумевается под этим высказыванием?
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
02.09.2010, 18:24  [ТС]     Определить количество элементов в стеке #22
MyClass obj1;
MyClass obj2;
MyClass obj3;

Каждый объект это стек:
obj1.Stack[];
obj2.Stack[];
и т.д.....

Внутри класса я могу задать только один размер
public:
int Stack[10];

то есть один размер для всех объектов.
А как же сделать чтоб obj2.Stack[] вмещал, скажем 15 элементов, а obj.Stack3 - только 5?
Nameless One
Эксперт С++
5765 / 3414 / 255
Регистрация: 08.02.2010
Сообщений: 7,432
02.09.2010, 18:29     Определить количество элементов в стеке #23
NikolaWhite, тебе нужно сделать конструктор с параметром, который принимает максимальное количество элементов, которое можно хранить в стеке. Внутреннее представление стека сделать не в виде статического, а в виде динамического массива. И выделять память под количество элементов, переданных конструктору, в конструкторе. А в деструкторе освобождать память.

PS. А еще лучше сделать стек в виде связного линейного списка (как у еasybudd'ы)
PPS. А еще лучше сделать его шаблонным
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
02.09.2010, 18:31     Определить количество элементов в стеке #24
NikolaWhite, или используй шаблоны, например есть класс Stack
C++
1
Stack<int, 5> ob1;
так передашь тип массива (int) и размер(5)
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
02.09.2010, 19:47  [ТС]     Определить количество элементов в стеке #25
Не проходил я еще динамические массивы в С++, и до шаблонов и деструкторов не добрался еще.

Не затруднит ли добавить строчку- другую для наглядности? Или подправить что....

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <conio.h>
using namespace std;
 
class MyClass
{
public:
    int Top;
    int Stack[];
public:
    MyClass() : Top(0) {}
};
 
int main()
{
MyClass obj1;
 
 
    _getch();
}
задолбался я уже
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.09.2010, 21:55     Определить количество элементов в стеке #26
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
#include <iostream>
#include <conio.h>
using namespace std;
 
class MyClass {
private://сдесь следует писать "private:", 
        //класс на то и класс, чтобы данные были защищены от изменений на прямую,
        //а работа с данными проводилась методами класса, описаных в "public:"
        int Top;
        int* Stack;
public:
        MyClass() : Top(0) {} //конструктор без параметров
        MyClass(int x) : Top(0) //конструктор с одним параметром - размером массива
        {
            Stack = new int [ x ]; //так как количество элементов в стеке нам зарание не известно,
                                   //то мы размещаем массив в динамической памяти
        }
        ~MyClass() //деструктор - вызывается автоматически при удалении объекта,
                   // а удаляется он автоматически, при выходе из ф-ции, в которой он обявлен
        {
            delete [] Stack; // освобождение динамической памяти
        }
};
 
int main()
{
    // создаем стек, к примеру на 100 элементов
    MyClass obj1(100); 
    getch();
    return 0; //возвращать значение в конце ф-ции main() необязательно, 
              //но писать ретурн является признаком хорошего тона)
}
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
02.09.2010, 22:21     Определить количество элементов в стеке #27
NikolaWhite Я не буду ничего добавлять в твой код, ни изменять, но попробую немного помочь.)
вот тебе небольшая прога которая занимается только тем что делает стеки и показывает кол-во элементов.

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
/*       stack.h  -  это хедер   */
 
//декларируем класс
template<class T, int number>
class Stack
{
    int count;
    T *arr;
 
public:
    Stack();
    void push(T);
    int top();
};
 
// дефолт-конструктор
template<class T, int number>
Stack<T, number>::Stack()
{
    arr = new T[number]; // делаем новый массив
    count = 0;           //cчетчик на нуль
}
 
//тут должен быть дестрактор !!!
 
 
//тут получим твой ТОП :)
template<class T, int number>
int Stack<T, number>::top()
{
    //ну вот, возвращаем номер последнего
    //заполненого индекса
    return count;
}
 
 
//заполняем стек
template<class T, int number>
void Stack<T, number>::push(T data)
{
    if(count < number)
    {
        arr[count] = data;
        count++;
    }
    else exit(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
#include <iostream>
#include <string>
#include "stack.h"
using namespace std;
 
int main()
{
    Stack<string, 5> stack;//тип стринг, размер 5
    int head;
 
    stack.push("hey, ");    //заполняем первые три индекса
    stack.push("student");
    stack.push("!!!");
 
    head = stack.top();//теперь равен 3
    cout << head << endl;
 
    // ради эксперемента делаем другой массив с совершенно другим типом
 
    Stack<int, 8> stack2;
 
    for(int i = 0; i < 6; i++)
        stack2.push(i);
    
        head = stack2.top();   // тут 6 элементов
    cout << head << endl;
 
 
    //system("pause");
    return 0;
}
ну вот .) Надеюсь чем то помог, если так, то респект мне и уважуха

Не по теме:


И еще, попробую тебя смотивировать, - лично я еще дней десять назад задавал вопросы на этом форуме что такое стек и с чем его едят, два дня назад я начал знакомится с шаблонами(template),
это на сам деле не сложно.)) Не забивай себе голову а пиши побольше кода, пусть это будет г***код (типа этого),
но тем не менее.)




Блин, опоздал, зато с шаблоном
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 12:06  [ТС]     Определить количество элементов в стеке #28
Ну вот наконец разобрался. Я с подобным примером в С# разбирался - было проще, без динамических
массивов, деструкторов и с одним единственным конструктором.

Добавлено через 12 часов 27 минут
bobromet я наконец-то разобрался с твоим кодом.Это было нелегко т.к. в моем учебнике я еще не
дошел до шаблонов классов.

В хедере я добавил функцию Pop

C++
1
2
3
4
5
6
template<class T ,int number>
int Stack<T ,number>::Pop()
{
    count--;
    return arr[count];
}
и без особых проблем вывожу целочисленное содержимое stack2 на экран:

C++
1
2
3
4
5
for(int i = 0;i < 5;i++)
    {
        int num = stack2.Pop();
        cout << num << " ";
    }
а как же вывести строковое содержимое stack2?
"Hey,student!!!" - это послание пока что дошло до меня в коде, а не на консоли.
Кто-нибудь???Плз.
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
03.09.2010, 13:59     Определить количество элементов в стеке #29
C++
1
2
3
4
5
6
7
8
9
template<class T, int number>
void Stack<T, number>::view()
{
    for(int i = 0; i < count; i++)
        cout << arr[i] << " ";
 
    cout << endl;
 
}
Все на много проще .)
Pop() должна удалять а не читать. Не забуть ~Stack() сделать.

Добавлено через 14 минут

Не по теме:

Так не жди пока дойдешь, пользуйся книгой как справочником - что то непонятно, нашел, прочитал.
если все по порядку.. там столько страниц! Я тоже кстати с С# начинал.
на C# программируют люди, на С++ программисты.))
Меня выражения типа

C++
1
2
3
4
int ***p1;
int **p2;
int *p3;
int ****stack = &p1;
до сих пор в ступор вгоняют.)

TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 14:22  [ТС]     Определить количество элементов в стеке #30
Похоже я с дестрактором что-то недопонял...

Дестрактор должен быть после дефолт-конструктора и перед функциями:

C++
1
2
3
4
~Stack()
{
    delete [] arr;
}
или я что-то не то уничтожаю?
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
03.09.2010, 14:52     Определить количество элементов в стеке #31
NikolaWhite, ты должен уничтожить временные/динамические объекты чтоб освободить память, то есть правильно.)
а где распологаешь вне декларации класса все равно, просто чтоб удобней самому - сначала дефолт-конструктор, потом дестрактор, потом остальные конструкторы, потом функции/методы. Возможно меня поправят.
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 15:36  [ТС]     Определить количество элементов в стеке #32
Просто где бы ни добавил дестрактор

C++
1
2
3
4
~Stack()
{
    delete [] arr;
}
выдаются ошибки:
error C2065: 'stack1' : undeclared identifier
error C2065: 'stack2' : undeclared identifier

А без дестрактора все работает(видимо пока память свободная есть)
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
03.09.2010, 16:10     Определить количество элементов в стеке #33
Ты наверное в декларации класса не декларировал его
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
template<class T, int number>
class Stack
{
    int count;
    T *arr;
 
public:
    Stack();
    ~Stack();  // <---- вот тут
    void push(T);
    void pop();
    void view();
    int top();
};
 
//дефолт-конструктор
//   .....
 
 
//дестрактор
 
template<class T, int number>
Stack<T, number>::~Stack()
{
    delete [] arr;
}
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 16:40  [ТС]     Определить количество элементов в стеке #34
Наконец-то покончено с этими стеками
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
03.09.2010, 16:51     Определить количество элементов в стеке #35
Поздравляю

попробуй для тренировки вот это реализовать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
#include "stack.h"
using namespace std;
 
int main()
{
    Stack<int, 5> stack;
    int i=1;
 
    while(stack.push(i))
        i++;
    while(stack.pop(i))
        cout << i << " ";
 
    return 0;
}
на выходе должно быть - 5 4 3 2 1

Подсказка: функции pop() и push() возвращают true если все нормально и false если стек полон, то есть имеют тип bool .)
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 18:58  [ТС]     Определить количество элементов в стеке #36
bobromet Я твою подсказку только что увидел
Сам додумался что Push() должна возвращать true пока не заполнен стек:

C++
1
2
3
4
5
6
7
8
9
10
11
template <class T, int number>
bool Stack<T, number>::Push(T data)
{
    if(count < number)
    {
    arr[count] = data;
    count++;
    return true;
    }
    else return false;
}
а Pop() возвращает true пока стек не пуст

А вот как вывести на экран - это мне пока не по зубам, видимо знаний не достаточно.

Очень любопытно было бы решение узнать.
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
03.09.2010, 19:06     Определить количество элементов в стеке #37
Цитата Сообщение от NikolaWhite Посмотреть сообщение
а Pop() возвращает true пока стек не пуст
А вот как вывести на экран - это мне пока не по зубам, видимо знаний не достаточно.
Обычно делается метод bool is_empty() и void pop() - если стек пуст, то надо выдать ошибку.

Вывод тогда будет выглядеть примерно так:
C++
1
2
3
4
while(!stack.is_empty()) {
   std::cout << stack.top();
   stack.pop();
}
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 19:18  [ТС]     Определить количество элементов в стеке #38
fasked я исходил из условий задачи:

C++
1
2
3
4
while(stack.push(i))
                i++;
        while(stack.pop(i))
                cout << i << " ";
а не

C++
1
2
3
4
while(!stack.is_empty()) {
   std::cout << stack.top();
   stack.pop();
}
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
03.09.2010, 19:50     Определить количество элементов в стеке #39
fasked, задачка чисто так сказать для понимания механики, с практической точки зрения смысла в ней мало конечно.
NikolaWhite вот решение.

C++
1
2
3
4
5
6
7
8
9
10
11
12
template<class T, int number>
bool Stack<T, number>::pop(T& data) //обрати внимание на параметр
{
    if(count > 0)
    {
        count--;
        data = arr[count];
        return true;
    }
    else return false;
 
}
сам сидел лоб морщил .)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2010, 19:58     Определить количество элементов в стеке
Еще ссылки по теме:

Определить количество положительных и количество отрицательных элементов массива C++
C++ Посчитать в стеке количество элементов между минимальным и максимальным значениями
C++ Определить количество положительных и количество отрицательных элементов до первого нуля. Найти ошибку в коде
C++ Определить сумму указанных элементов, количество нечетных элементов и среднее арифметическое четных элементов массива
Определить количество положительных и количество отрицательных элементов заданного массива C++

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

Или воспользуйтесь поиском по форуму:
TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 19:58  [ТС]     Определить количество элементов в стеке #40
У меня крутилось в голове что надо по ссылке значения передавать когда требуется чтобы
функция более одного значения возвращала, просто не до конца я еще освоил эту тему шаблонов.
Yandex
Объявления
03.09.2010, 19:58     Определить количество элементов в стеке
Ответ Создать тему
Опции темы

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