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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
#1

Стеки - C++

03.11.2012, 15:15. Просмотров 2303. Ответов 47
Метки нет (Все метки)

Реализовать программу, в которой будут использоваться стеки (магазинный и кольцевой) и очередь. В самих программах реализовать такие функции:
заполнение стека(очереди) вручную, удаление и добавление элементов, вывод содержимого на экран, очистка стека (очереди).
Смотрел и читал на форуме о стеках но не понял на чем их применять или они сами по себе?
Можете на коде объяснить своими словами как работает стек?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2012, 15:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стеки (C++):

Стеки на С! - C++
Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода и вывода элементов стека. Добавлять...

Стеки - C++
Помогите разобраться со стеками.Вылетает 3 ошибки при компеляции. #include <stdio.h> #include <stdlib.h> #include <conio.h> ...

Стеки - C++
Вот код как к первому стеку прикрипить 2 стек?????? #include "stdafx.h" #include "iostream" using namespace std; typedef struct el ...

Стеки С++ - C++
Добрый вечер.Задание следующие нужно сделать добавление в стек после елемента L.Дано 2 стека X Y из них добавить верхушку с X в Z до...

стеки - C++
создать файл записей с полями: фамилия, возраст. за один просмотр файла вывести фамилии наиболее старых людей.

Стеки - C++
Создать класс типа - стек. Функции-члены вставляют элемент в стек, вытаскивают элемент из стека. Проверяют вершину стека. Помогите...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Герц
04.11.2012, 12:37     Стеки
  #16

Не по теме:

а мы не учили в универе стеки и тут все свалилось на голову)
Если ты будешь рассчитывать на то, что тебя в универе чему-то обучат, то ничего не достигнешь. Нужно самому учиться.

0
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 15:12  [ТС] #17
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;
 
class Stack
{
private:
    int count;//кількість
    struct Node//структура вузол
    {
        char data;//дані шаблонного типу
        Node* prev;//покажчик на попередній елемент
        char& getData(void)//функція що повертає сслику на дані
        {
            return data;// повертаємо дані
        }
    };
    Node* bottom;//покажчик на вершину стеку
public:
    Stack(void):count(0), bottom(0)//облнуляємо змінні в констукторі
    {
    }
    ~Stack(void)//дестуктор
    {
        clear();//викликаємо функцію очищення
    }
    
    void push(char elem)//функція яка добаляє елемент на вершину стеку, приймає на вхід дані
    {
        Node* Temp = new Node;//створюємо новий елемент
        Temp->data = elem;//заповнюємо його дані вхідними даними
        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;//обнуляємо вершину
    }
    char 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;//повертаємо ссилку на поток
    }
};
почему в строчках
C++
1
 Node* p = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
C++
1
Node* b = obj.bottom;//створюємо новий покажик який зберігає в собі вершину переданого в оператор обєкту
не определяется Node* ?
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.11.2012, 15:37 #18

Не по теме:

Ужасные комментарии в коде.


Что именно вас смущает? Тип Node*? Это указатель на Node. Или то, что не идёт отдельно
Node *a;
a = obj.bottom;
?
0
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 16:42  [ТС] #19
Я имел в виду что указатель Node* не определяется, то есть сначала все нормально,а в строчках что выше написал, пишет что Node* не определен.

Добавлено через 17 минут
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
101
102
103
104
105
106
107
#pragma once
#include <iostream>
using namespace std;
 
class Stack
{
private:
    int count;//кількість
    struct Node//структура вузол
    {
        char data;//дані шаблонного типу
        Node* prev;//покажчик на попередній елемент
        char& getData(void)//функція що повертає сслику на дані
        {
            return data;// повертаємо дані
        }
    };
    Node* bottom;//покажчик на вершину стеку
public:
    Stack(void):count(0), bottom(0)//облнуляємо змінні в констукторі
    {
    }
    ~Stack(void)//дестуктор
    {
        clear();//викликаємо функцію очищення
    }
    
    void push(void)//функція яка добаляє елемент на вершину стеку, приймає на вхід дані
    {
        Node* Temp = new Node;//створюємо новий елемент
        fflush(stdin);
        printf("Insert queue element: ");                /*temp->data = value;*/
 
        if(!bottom)
        {
        bottom = Temp;
        count++;//інкрементуємо лічильник
        cout<<"Element: \""<<Temp->data<<"\" has been added to bottom."<<endl;
        return;
        }
        Temp->prev = bottom;//вказуємо що вершина знаходиться перед ним
        bottom = Temp;
        cout<<"Element: \""<<Temp->data<<"\" has been added to bottom."<<endl;
        count++;
    }
    void pop(void)//функція видалення елементу з вершини
    {
        if(!bottom)//у разі коли вершини не існує
        {
            cout<<"Err. Stack is empty."<<endl;//виводимо на екран помилку
            return;//виходимо з функції, не повертаючи значення
        }
        Node* pTemp = bottom->prev;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
        delete bottom;//видаляємо вершину
        cout<<"Element \""<<bottom->data<<"\" is deleted from bottom"<<endl;
        bottom = pTemp;//нова вершина рівна тому елементу
        count--;//декрементуємо лічильник
    }
    void clear(void)//функція очищення
    {
        while(bottom)//циклічно виконуємо доки існую вершина
        {
            Node* delPtr = bottom->prev;//створюємо новий елемент який зберігає в собі елемент на рівень нижчий вершини
            delete bottom;//видаляємо вершину
            bottom = delPtr;//нова вершина рівна тому елементу
        }
        count = 0;//обнуляємо лічильник
        bottom = NULL;//обнуляємо вершину
        cout<<" All elements of queue is deleted."<<endl;
    }
    char 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;//повертаємо ссилку на поток
    }
};
пробовал сделать второй пример похожий на первый но получилась белиберда) что посоветуете?
0
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.11.2012, 16:56 #20
А, тьфу, понял. Stack::Node*, а не просто Node*. Это внутренний класс Stack, так что надо писать квалификатор.
1
dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 18:07 #21
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
так что надо писать квалификатор.
Вы уж простите меня за столь ужасный стиль написания, и неровные комменты, писал лабораторную работу еще на первом курсе, та и не себе). Отсутствие квалификатора плохо, в глобальных переменных тоже сейчас использую квалификатор.
0
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 к этому примеру?
0
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;
}
1
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 20:04  [ТС] #24
спасибо большое, да я пытался но я не знаю почему не выходит
0
dederkay
34 / 34 / 0
Регистрация: 08.12.2010
Сообщений: 161
04.11.2012, 21:05 #25
Обращайтесь) но я б посоветовал вам читать книги а не посты на форумах) хотя на кибере можно тут все добрые, по крайней мере я не встречал плохих.
0
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
04.11.2012, 21:09  [ТС] #26
А как должен работать кольцевой стек?

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

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

Добавлено через 45 секунд
так вот защита запретит переполнение, либо можно увеличить длину стека) все в ваших руках
1
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--;//декрементуємо лічильник
    }
как то так?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 22:11
Привет! Вот еще темы с ответами:

Стеки - C++
Создать стек с числами в диапазоне от –50 до +50.Создать новый стек, в который поместить каждый третий элемент пер-вого стека.

Стеки - C++
Переставить элементы стека в таком порядке:x(1),x(2)...x(n)-&gt;x(1),x(n-1),x(2),x(n-2)... Элементы пронумерованы в порядке их введения в...

Стеки - C++
Здравствуйте, помогите пожалуйста осилить задачу. Задача: Вот то что я написал, а дальше что то никак не идет. #include...

Стеки - C++
Сделал очередь, а вот кольцевой не получается, подскажите как сделать. #include &lt;iostream&gt; using namespace std; int main() { ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.11.2012, 22:11
Ответ Создать тему
Опции темы

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