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

Стеки - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
03.11.2012, 15:15     Стеки #1
Реализовать программу, в которой будут использоваться стеки (магазинный и кольцевой) и очередь. В самих программах реализовать такие функции:
заполнение стека(очереди) вручную, удаление и добавление элементов, вывод содержимого на экран, очистка стека (очереди).
Смотрел и читал на форуме о стеках но не понял на чем их применять или они сами по себе?
Можете на коде объяснить своими словами как работает стек?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2012, 15:15     Стеки
Посмотрите здесь:

C++ Стеки
Стеки C++
Стеки C++
C++ Стеки
C++ Стеки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 18:07     Стеки #21
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
так что надо писать квалификатор.
Вы уж простите меня за столь ужасный стиль написания, и неровные комменты, писал лабораторную работу еще на первом курсе, та и не себе). Отсутствие квалификатора плохо, в глобальных переменных тоже сейчас использую квалификатор.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 19:24  [ТС]     Стеки #22
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#pragma once
#include <iostream>
using namespace std;
template<class NODETYPE>
class Stack
{
protected:
    int count;//кількість
    struct Node//структура вузол
    {
        NODETYPE data;//дані шаблонного типу
        Node* prev;//покажчик на попередній елемент
        NODETYPE& getData(void)//функція що повертає сслику на дані
        {
            return data;// повертаємо дані
        }
    };
    Node* bottom;//покажчик на вершину стеку
public:
    Stack(void):count(0), bottom(0)//облнуляємо змінні в констукторі
    {
    }
    ~Stack(void)//дестуктор
    {
        clear();//викликаємо функцію очищення
    }
    
    void push(NODETYPE someData)//функція яка добаляє елемент на вершину стеку, приймає на вхід дані
    {
        Node* Temp = new Node;//створюємо новий елемент
        Temp->data = someData;//заповнюємо його дані вхідними даними
        Temp->prev = bottom;//вказуємо що вершина знаходиться перед ним
        bottom = Temp;//тепер вершина і є він
        count++;//інкрементуємо лічильник
    }
    void pop(void)//функція видалення елементу з вершини
    {
        if(!bottom)//у разі коли вершини не існує
        {
            cout<<"Err. Stack is empty."<<endl;//виводимо на екран помилку
            return;//виходимо з функції, не повертаючи значення
        }
        Node* pTemp = bottom->prev;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
        delete bottom;//видаляємо вершину
        bottom = pTemp;//нова вершина рівна тому елементу
        count--;//декрементуємо лічильник
    }
    void clear(void)//функція очищення
    {
        while(bottom)//циклічно виконуємо доки існую вершина
        {
            Node* delPtr = bottom->prev;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
            delete bottom;//видаляємо вершину
            bottom = delPtr;//нова вершина рівна тому елементу
        }
        count = 0;//обнуляємо лічильник
        bottom = NULL;//обнуляємо вершину
    }
    NODETYPE getBottomData(void)const//функція що повертає дані з вершини
    {
        return bottom->data;//повертаємо дані вершини
    }
    int rCount(void)const//функція що повертає кількість елементів
    {
        return count;//повертаємо лічильник(поточна кількість)
    }
    friend ostream& operator<<(ostream &o, const Stack &obj)//оператор запису в поток
    {
        if(!obj.bottom)//у разі коли обєкту не існує
        {
            o<<"Err. Stack is empty."<<endl;//записуємо в поток меседж про помилку
            return o;//повертаємо ссилку на поток для того щоб можна було робити так cout<<stack<<"lolwto?";
        }
        o<<"\n";//записуємо в поток перехід на новий рядок
        Node* p = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
        for(; p; p = p->prev)//циклічно перебраємо всі елементи покажчика
        {
            o<<" * "<<p->data<<" * "<<endl;//записуючи в поток виведення дані з зірочками по сторонам і переходами на новий рядок
        }
        o<<endl;//перехід на новий рядок
        return o;
    }
    friend istream& operator>>(istream &i, Stack &obj)//оператор зчитування з потоку
    {
        Node* b = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
        for(; obj.bottom; obj.bottom = obj.bottom->prev)//циклічно перебраємо всі елементи об'єкту
        {
            cout<<"Insert stack data: ";//виводимо на екран "введіть дані"
            i>>obj.bottom->getData();//зчитуємо  потоку дані записуючи їх в дані елементу стеку
        }
        obj.bottom = b;//відновлюємо покажчик на голову
        return i;//повертаємо ссилку на поток
    }
};
а как будет выглядеть функция main к этому примеру?
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 19:30     Стеки #23
тогда делал так, ну что нашел то даю, хотя вы уже должны были по предыдущему сами догадаться))
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 "Stack.h"
#include "menu.h"
 
 
 
 
int main()
{
    char keyPress = NULL;
    Stack<int> intS;
    while(1)
    {
        menu();
 
        cout<<"\nUse your brain: ";
        keyPress = _getch();
        switch(keyPress)
        {
        case '1':
            {
                int someData = 0;
                cout<<"Insert data: ";
                cin>>someData;
                intS.push(someData);
                break;
            }
        case '2':
            {
                intS.pop();
                break;
            }
        case '3':
            {
                cout<<intS;
                break;
            }
        case '4':
            {
                cout<<"\nStack count:"<<intS.rCount()<<endl;
                break;
            }
        case '5':
            {
                cout<<"\nBottom data: \""<<intS.getBottomData()<<"\"."<<endl;
                break;
            }
        case '6':
            {
                cin>>intS;
                break;
            }
        default:
            {
                cout<<"Wrong key."<<endl;
                break;
            }
        case 27:
            {
                exit(1);
                break;
            }
        }
    }
    return 0;
}
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 20:04  [ТС]     Стеки #24
спасибо большое, да я пытался но я не знаю почему не выходит
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 21:05     Стеки #25
Обращайтесь) но я б посоветовал вам читать книги а не посты на форумах) хотя на кибере можно тут все добрые, по крайней мере я не встречал плохих.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 21:09  [ТС]     Стеки #26
А как должен работать кольцевой стек?

Добавлено через 2 минуты
Не пойму как связать начало и конец
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 21:17     Стеки #27
ну вот в структуре видно что есть указатель на прев(предыдущий элемент) вот если присвоить привиосу самого верхнего элемента нижний, тогда и получим кольцевой стек только поломает всю программу)))

Добавлено через 44 секунды
та и нужно делать защиту от переполнения, а то не красиво все будет)))
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 21:21  [ТС]     Стеки #28
теперь понял, а что за защита такая?)
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 21:28     Стеки #29
ну например вы хотите в стек величиной в 30 элементов, запихнуть 50 значений, в стек без защиты данные будут внесены но выйдет что первые 20 затрутся последними 20( 30 - 50), ну как то не складно звучит, но надеюсь вы поняли, если нет попытаюсь объяснить как то по другому)

Добавлено через 45 секунд
так вот защита запретит переполнение, либо можно увеличить длину стека) все в ваших руках
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 22:11  [ТС]     Стеки #30
ну эт не обязательно в моем случае но запомнить надо) спасибо, теперь буду пытаться переделать на кольцевой

Добавлено через 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#pragma once
#include <iostream>
using namespace std;
template<class NODETYPE>
class Stack
{
protected:
    int count;//кількість
    struct Node//структура вузол
    {
        NODETYPE data;//дані шаблонного типу
        Node* next;//покажчик на попередній елемент
    };
    Node* bottom;//покажчик на вершину стеку
    Node* top;
public:
    Stack(void):count(0), top(0), bottom(0)//облнуляємо змінні в констукторі
    {
    }
    ~Stack(void)//дестуктор
    {
        clear();//викликаємо функцію очищення
    }
    
    void push(NODETYPE someData)//функція яка добаляє елемент на вершину стеку, приймає на вхід дані
    {
        Node* Temp = new Node;//створюємо новий елемент
        Temp->data = someData;//заповнюємо його дані вхідними даними
        Temp->top = bottom;//вказуємо що вершина знаходиться перед ним
        bottom = Temp;//тепер вершина і є він
        count++;//інкрементуємо лічильник
    }
    void pop(void)//функція видалення елементу з вершини
    {
        if(!bottom)//у разі коли вершини не існує
        {
            cout<<"Err. Stack is empty."<<endl;//виводимо на екран помилку
            return;//виходимо з функції, не повертаючи значення
        }
        Node* pTemp = bottom->top;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
        delete bottom;//видаляємо вершину
        bottom = pTemp;//нова вершина рівна тому елементу
        count--;//декрементуємо лічильник
    }
как то так?
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 22:26     Стеки #31
ну как бы, я имел в виду что самый нижний элемент:
например:
(1) - боттом
(2) - первый прев
(3) - второй прев
(4) - последний прев
и вновь (1) - боттом, который в свою очередь указывает на (2) ...... и все по новому кругу, таким образом стек и зацикливается, вы же умеете юзать дебаггер, вот и посмотрите ваш стек зациклен? к тому же добавление нового указателя лишнее телодвижение, можно обойтись и без него. Надеюсь мы с вами дойдем до результата) Удачи)
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 22:30  [ТС]     Стеки #32
понял
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 22:44     Стеки #33
ну вот например первое что пришло в голову:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void push(NODETYPE someData)
    {
        Node* Temp = new Node;
        Temp->data = someData;
        Temp->prev = bottom;
        
        bottom = Temp;
        if(bottom->prev && !bottom->prev->prev)
        {
            bottom->prev->prev = Temp;
        }
        count++;
    }
надеюсь дав вам код я вас не сильно расстроил ибо прийти самостоятельно к решению очень приятно)
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 22:54  [ТС]     Стеки #34
ааа так эт через условие надо) тьфу а я сижу мучаюсь так пишу)

Добавлено через 1 минуту
мда самому приятно, особенно если сидишь целый день и ничего не получается) только Вы меня выручаете постоянно)
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 23:00     Стеки #35
Цитата Сообщение от Liberation Посмотреть сообщение
только Вы меня выручаете постоянно)
вы пишете на форум, и кто то из Форумчан вам помогает, я могу еще раз повторится тут добрые люди, вам помогут, если у вас есть желание, вы будете пытаться и стараться. Вы учили алгоритмы? Ведь именно применение алгоритмов помогут вам достичь цели) принимайте не абстракцию, а реальные числа и вам станет проще, ну и условия они всегда нужны, ведь вам нужно проверять делать ли то или инное, учитесь использовать все возможности языка)
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 23:02  [ТС]     Стеки #36
а как же он графично должен работать, как и предыдущее два?
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 23:06     Стеки #37
хотя данный пример настолько прост и банален, что я просто уверен поучи вы немножко больше книжки и сделали б самостоятельно даже лучше меня, именно по тому что код был бы ваш)

Добавлено через 3 минуты
ну во первых тот перегруженный оператор не будет так хорошо работать как нужно ведь стек зациклен и он просто повиснет) вы просто должны решить сколько раз нужно проходить по циклу или же каким то образом связать его с количеством элементов в стеке, например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
friend ostream& operator<<(ostream &o, const Stack &obj)//оператор запису в поток
    {
        if(!obj.bottom)
        {
            o<<"Err. Stack is empty."<<endl;
            return o;
        }
        o<<"\n";
        Stack::Node* p = obj.bottom;
        for(unsigned int i = 3; p && i > 0 ; p = p->prev)//где три это как раз колво сколько элементов вывести
        {
            o<<" * "<<p->data<<" * "<<endl;
            --i;
        }
        o<<endl;
        return o;
    }
код не проверял
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 23:16  [ТС]     Стеки #38
проблема в том что в этой части кода пишет что Stack::Node* не имеет аргументов для шаблона класса, а также пишет что bottom не доступен
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 23:22     Стеки #39
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
friend ostream& operator<<(ostream &o, const Stack &obj)//оператор запису в поток
    {
        if(!obj.bottom)//у разі коли обєкту не існує
        {
            o<<"Err. Stack is empty."<<endl;
            return o;
        }
        o<<"\n";
        Stack::Node* p = obj.bottom;
        for(unsigned int i = 3; p && i > 0 ; p = p->prev)
        {
            o<<" * "<<p->data<<" * "<<endl;
            --i;
        }
        o<<endl;
        return o;
    }
вот так работает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 23:38     Стеки
Еще ссылки по теме:

Стеки C++
Стеки C++
стеки C++

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

Или воспользуйтесь поиском по форуму:
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 23:38  [ТС]     Стеки #40
хм, у меня жалуется на Стек и боттом, а в самой программе зацикливание

Добавлено через 51 секунду
пробовал поставить тип char но не помогло

Добавлено через 6 минут
поставил char вместо NODETYPE ошибки исчезли, но зацикливание осталось
Yandex
Объявления
04.11.2012, 23:38     Стеки
Ответ Создать тему
Опции темы

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