Форум программистов, компьютерный форум 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, 23:43     Стеки #41
приведите плз весь код, и еще какая студия или компилятор?

Добавлено через 47 секунд
какой чар? тут же шаблон)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 23:48  [ТС]     Стеки #42
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
95
96
97
98
99
100
#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;
        if(bottom->prev && !bottom->prev->prev)
        {
            bottom->prev->prev = 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";//записуємо в поток перехід на новий рядок
        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;
    }
    friend istream& operator>>(istream &i, Stack &obj)//оператор зчитування з потоку
    {
        Stack::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;//повертаємо ссилку на поток
    }
};
не знаю что не так

Добавлено через 22 секунды
студия 2010
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 23:59     Стеки #43
мде, вот вам и разница в студиях, 2012 не ругается и довольно приятно отвечает на все действия. Хотя новый стандарт поддерживает не полностью. Если доберусь до ноутбука помогу, ибо тут у меня только 8 и 12. Сейчас на 8 проверю.

Добавлено через 3 минуты
восьмая тоже все норм) остается добраться до 10 но по случаю у меня нет, только на ноуте, а щас дотсупа к нему нет)
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
05.11.2012, 20:37  [ТС]     Стеки #44
ну ща попробую скачать 2012 и посмотрю

Добавлено через 20 часов 37 минут
да работает, правда как то странно, я так понял надо сделать так что бы элементы можно было добавлять с начала и с конца? и также удалять?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.11.2012, 21:43     Стеки #45
И что это тогда за стек такой будет? Называйте его своим именем: дек.
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
05.11.2012, 22:08     Стеки #46
Цитата Сообщение от Liberation Посмотреть сообщение
добавлять с начала и с конца? и также удалять?
ТС вам же нужен кольцевой стек. Зачем нужно делать дек? или задача все таки сделать дек? Тогда старайтесь правильно формулировать задачу, или проштудируйте хотя бы вики по данному вопросу)
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
05.11.2012, 23:14  [ТС]     Стеки #47
так значит последний пример и есть кольцевой ? чет я не понял как он работает, просто удаляешь верх и второй элемент становится началом и концом?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2012, 23:20     Стеки
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
dederkay
 Аватар для dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
05.11.2012, 23:20     Стеки #48
ну поймите теперь он зациклен, формально начала или конца нет стек как кольцо, вот поставьте например вместо тройки в цикле вывода 20, но введите только 4 элемента в стек и вы увидите что элементы повторяются. Ну просто так же вы просто можете проверить на колцевость в вотче просмотрев куда указывает привиос каждого элемента, так вот вы никогда не достигнете конца ибо все будет повторятся много раз)
Yandex
Объявления
05.11.2012, 23:20     Стеки
Ответ Создать тему
Опции темы

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