С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

01.09.2010, 21:42. Просмотров 2323. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2010, 21:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить количество элементов в стеке (C++):

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

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

Дан массив целых чисел. Определить количество четных элементов и количество элементов, оканчивающихся на цифру 5 - C++
Дан массив целых чисел. Определить количество четных элементов и количество элементов, оканчивающихся на цифру 5 с++

количество четных элементов одномерного массива до числа равному а, Определить количество нечетных элементов двумерного массива - C++
1.Найти количество четных элементов одномерного массива до первого встреченного числа равного наперед заданному числу а. 2.Дан двумерный...

Определить количество нулевых элементов, количество элементов в интервале от 5 до 10 - C++
задание : Общее задание - Даны вещественные массивы c, d. В программе предусмотреть функции: - ввода массивов с клавиатуры; ...

Определить количество отрицательных элементов, количество элементов в интервале от 1 до 5 - C++
Доброго времени суток. Помогите пожалуйста с задачей.Буду очень благодарна. Даны вещественные массивы c, d.Определить количество...

39
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
01.09.2010, 23:50 #16
Цитата Сообщение от bobromet Посмотреть сообщение
Какой смысл делать класс с двумя одинаковыми стеками?
Вот и я о том же думаю...

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <stdexcept>
#include <string>
#include <cstdlib>
 
class Stack {
    struct Node {
        int nValue;
        Node * pNext;
        Node(int val) : nValue(val), pNext(NULL) {}
    };
    Node * top;
public:
    Stack() : top(NULL) {}
    ~Stack(){
        Node * tmp;
        while ( top ){
            tmp = top->pNext;
            delete top;
            top = tmp;
        }
    }
    void push(int val){
        Node * pNode = new Node(val);
        pNode->pNext = top;
        top = pNode;
    }
    int pop(){
        int val;
        Node * next;
        
        if ( ! top )
            throw std::runtime_error("Empty stack!");
        
        val = top->nValue;
        next = top->pNext;
        delete top;
        top = next;
        
        return val;
    }
    bool empty() const {
        return top == NULL;
    }
    int count() const {
        int cnt = 0;
        Node * node;
        for ( node = top; node; node = node->pNext )
            ++cnt;
        
        return cnt;
    }
};
 
int main(){
    Stack stack;
    std::string buf;
    
    std::cout << "Enter some values one per string. Empty string - finish." << std::endl;
    while ( true ){
        std::cout << "> ";
        std::getline(std::cin, buf);
        if ( buf.empty() )
            break;
        stack.push(atoi(buf.c_str()));
    }
    
    if ( stack.empty() ){
        std::cout << "Empty stack" << std::endl;
        return 0;
    }
    
    std::cout << "Stack contains " << stack.count() << " elements" << std::endl;
    while ( ! stack.empty() )
        std::cout << stack.pop() << std::endl;
    
    return 0;
}
2
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.09.2010, 04:57 #17
Если уж сильно надо знать размер стека, то ИМХО лучше завести для него поле-счетчик в классе, чем каждый раз перебирать все его элементы
Ну а если стек реализован в виде массива, то тогда и вышеупомянутые решения сойдут
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
02.09.2010, 09:43 #18
Цитата Сообщение от Nameless One Посмотреть сообщение
Если уж сильно надо знать размер стека, то ИМХО лучше завести для него поле-счетчик в классе
Я в умной книжке читал рассуждения по поводу размеров списков, стеков, очередей и прочих нестабильных субстанций Букв там было много, но в общей сложности всё сводилось к тому, на сколько часто нужно получать количество элементов в контейнере. Если эта величина нужна постоянно, то разумнее держать переменную с размером и корректировать её значение при добавлении/удалении элементов. Если сведения о количестве элементов - вещь особо не востребованная, то наоборот накладнее поддерживать в актуальном состоянии счётчик, а при необходимости просто элементы посчитать. Опять же решение сильно зависит от предполагаемых размеров контейнера. Если элементов будет много, то даже время от времени их пересчитывать - долгая процедура. С другой стороны количество элементов в стеке или очереди редко интересно. Обычно программа работает по той логике, что пока они (элементы) там (в стеке/очереди) есть, нужно с ними что-то делать...
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.09.2010, 10:25 #19
Цитата Сообщение от easybudda Посмотреть сообщение
Букв там было много, но в общей сложности всё сводилось к тому, на сколько часто нужно получать количество элементов в контейнере. Если эта величина нужна постоянно, то разумнее держать переменную с размером и корректировать её значение при добавлении/удалении элементов. Если сведения о количестве элементов - вещь особо не востребованная, то наоборот накладнее поддерживать в актуальном состоянии счётчик, а при необходимости просто элементы посчитать.
Я примерно это же и имел в виду
0
TheMachinist
244 / 176 / 15
Регистрация: 14.06.2010
Сообщений: 422
02.09.2010, 18:04  [ТС] #20
Easybudda спасибо конечно,но ваш код сложноват для меня Я всего третью неделю С++ изучаю.Только подчерпнул павильный синтаксис для функций IsFull() и IsEmpty().

Благодаря этому благородному сообществу разобрался я со стеками(почти).Спасибо еще раз за помощь

Осталось назначить для каждого объекта свой размер массива.... я всяко перепробовал.
Буду очень признателен.
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.09.2010, 18:09 #21
Цитата Сообщение от NikolaWhite Посмотреть сообщение
Осталось назначить для каждого объекта свой размер массива.... я всяко перепробовал.
Буду очень признателен.
а вот с этого места поподробнее. Что конкретно подразумевается под этим высказыванием?
0
TheMachinist
244 / 176 / 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?
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
02.09.2010, 18:29 #23
NikolaWhite, тебе нужно сделать конструктор с параметром, который принимает максимальное количество элементов, которое можно хранить в стеке. Внутреннее представление стека сделать не в виде статического, а в виде динамического массива. И выделять память под количество элементов, переданных конструктору, в конструкторе. А в деструкторе освобождать память.

PS. А еще лучше сделать стек в виде связного линейного списка (как у еasybudd'ы)
PPS. А еще лучше сделать его шаблонным
1
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
02.09.2010, 18:31 #24
NikolaWhite, или используй шаблоны, например есть класс Stack
C++
1
Stack<int, 5> ob1;
так передашь тип массива (int) и размер(5)
1
TheMachinist
244 / 176 / 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();
}
задолбался я уже
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 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() необязательно, 
              //но писать ретурн является признаком хорошего тона)
}
1
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),
это на сам деле не сложно.)) Не забивай себе голову а пиши побольше кода, пусть это будет г***код (типа этого),
но тем не менее.)




Блин, опоздал, зато с шаблоном
2
TheMachinist
244 / 176 / 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!!!" - это послание пока что дошло до меня в коде, а не на консоли.
Кто-нибудь???Плз.
0
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;
до сих пор в ступор вгоняют.)

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

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

C++
1
2
3
4
~Stack()
{
    delete [] arr;
}
или я что-то не то уничтожаю?
0
03.09.2010, 14:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2010, 14:22
Привет! Вот еще темы с ответами:

Определить сумму указанных элементов, количество нечетных элементов и среднее арифметическое четных элементов массива - C++
Дан двумерный массив целых чисел. Определить: 1. Сумму элементов массива, больших 30 2. Количество нечетных элементов массива 3....

В массиве A из N элементов (N не больше 30) определить количество элементов, имеющих четные значения, и сумму этих элементов. - C++
1. В массиве A из N элементов (N не больше 30) определить количество элементов, имеющих четные значения, и сумму этих элементов. Число N и...

Определить количество положительных и количество отрицательных элементов заданного массива - C++
Определить количество положительных и количество отрицательных чисел массива

Определить количество положительных и количество отрицательных элементов до первого нуля. Найти ошибку в коде - C++
В маcсиве A(n) (n&lt;=7) хотя бы один элемент ноль. Определить количество положительных и количество отрицательных элементов до первого нуля! ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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