Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/79: Рейтинг темы: голосов - 79, средняя оценка - 4.96
 Аватар для TheMachinist
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422

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

01.09.2010, 21:42. Показов 16064. Ответов 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();
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.09.2010, 21:42
Ответы с готовыми решениями:

В стеке определить количество элементов имеющих значения меньше среднего
Написать программу по созданию, добавлению, просмотру и решению поставленной задачи для однонаправленного линейного списка типа СТЕК....

В стеке определить количество элементов, имеющих значения меньше среднего и удалить эти элементы
Здравствуйте. Помогите пожалуйста исправить код. Создать стек из случайных чисел и определить, сколько элементов стека имеют значения...

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

39
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
02.09.2010, 18:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от NikolaWhite Посмотреть сообщение
Осталось назначить для каждого объекта свой размер массива.... я всяко перепробовал.
Буду очень признателен.
а вот с этого места поподробнее. Что конкретно подразумевается под этим высказыванием?
0
 Аватар для TheMachinist
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
02.09.2010, 18:24  [ТС]
MyClass obj1;
MyClass obj2;
MyClass obj3;

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

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

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

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

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

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();
}
задолбался я уже
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
02.09.2010, 21:55
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() необязательно, 
              //но писать ретурн является признаком хорошего тона)
}
1
25 / 25 / 3
Регистрация: 06.03.2010
Сообщений: 59
02.09.2010, 22:21
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),
это на сам деле не сложно.)) Не забивай себе голову а пиши побольше кода, пусть это будет г***код (типа этого),
но тем не менее.)




Блин, опоздал, зато с шаблоном
2
 Аватар для TheMachinist
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 12:06  [ТС]
Ну вот наконец разобрался. Я с подобным примером в С# разбирался - было проще, без динамических
массивов, деструкторов и с одним единственным конструктором.

Добавлено через 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!!!" - это послание пока что дошло до меня в коде, а не на консоли.
Кто-нибудь???Плз.
0
25 / 25 / 3
Регистрация: 06.03.2010
Сообщений: 59
03.09.2010, 13:59
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;
до сих пор в ступор вгоняют.)

1
 Аватар для TheMachinist
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 14:22  [ТС]
Похоже я с дестрактором что-то недопонял...

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

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

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

А без дестрактора все работает(видимо пока память свободная есть)
0
25 / 25 / 3
Регистрация: 06.03.2010
Сообщений: 59
03.09.2010, 16:10
Ты наверное в декларации класса не декларировал его
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;
}
1
 Аватар для TheMachinist
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 16:40  [ТС]
Наконец-то покончено с этими стеками
0
25 / 25 / 3
Регистрация: 06.03.2010
Сообщений: 59
03.09.2010, 16:51
Поздравляю

попробуй для тренировки вот это реализовать
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 .)
0
 Аватар для TheMachinist
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 18:58  [ТС]
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 пока стек не пуст

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

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

Вывод тогда будет выглядеть примерно так:
C++
1
2
3
4
while(!stack.is_empty()) {
   std::cout << stack.top();
   stack.pop();
}
0
 Аватар для TheMachinist
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 19:18  [ТС]
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();
}
0
25 / 25 / 3
Регистрация: 06.03.2010
Сообщений: 59
03.09.2010, 19:50
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;
 
}
сам сидел лоб морщил .)
1
 Аватар для TheMachinist
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
03.09.2010, 19:58  [ТС]
У меня крутилось в голове что надо по ссылке значения передавать когда требуется чтобы
функция более одного значения возвращала, просто не до конца я еще освоил эту тему шаблонов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.09.2010, 19:58

Подсчитать количество элементов в стеке
Помогите написать программу &quot;Подсчитать количество элементов в стеке&quot;. Заранее большое спасибо.

Подсчитать количество элементов в стеке
1. Сформировать список строк из текстового файла. 2. Подсчитать количество элементов в стеке

Подсчитать количество элементов в стеке
Помогите пожалуйста реализовать подсчёт количества элементов в стеке! program steki_lr2; uses crt; type pitem = ^item; ...

Подсчитать количество элементов в стеке
Помогите написать код на паскале (сам не шарю) Задание: Подсчитать количество элементов в стеке. Чтобы можно было задать размер стека и...

Реализовать операции со стеком в массиве. Количество элементов в стеке должно соответствовать длине массива
Реализовать операции со стеком в массиве. Количество элементов в стеке должно соответствовать длине массива. Добавлено через 10 часов...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru