0 / 0 / 0
Регистрация: 02.03.2022
Сообщений: 39
1

Работа со стеками. создать в классе два стека

23.10.2022, 07:13. Показов 345. Ответов 5

Author24 — интернет-сервис помощи студентам
Дана задача и код к ней. При компиляции у меня идёт постоянное заполнение стека. Что я нажимаю не так?
Объясните пожалуйста

Создать класс для работы со стеком. Элемент стека – символ.
- Сформировать два стека,содержащие последовательности символов.
- Подсчитать общее число элементов в стеках, предусмотреть восстановление их исходного расположения.

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
 
class CharStack
{
    struct CharStackNode
    {
        char _character;
        CharStackNode* _next;
 
        CharStackNode(char character) :
            _character(character),
            _next(0)
        {
        }
    };
 
public:
    void input_char_stack(CharStack& char_stack);
    size_t length_of_char_stack(CharStack& char_stack);
 
    CharStack() :
        _top(0)
    {
    }
 
    CharStack(const CharStack& source) :
        _top(0)
    {
        if (source._top != 0)
        {
            CharStackNode* i = source._top->_next;
            CharStackNode* j = new CharStackNode(source._top->_character);
 
            _top = j;
 
            while (i != 0)
            {
                j->_next = new CharStackNode(i->_character);
 
                i = i->_next;
                j = j->_next;
            }
        }
    }
 
    ~CharStack()
    {
        char dummy;
 
        while (pop(dummy));
    }
 
    void push(char character)
    {
        CharStackNode* new_elem = new CharStackNode(character);
 
        if (_top == 0)
        {
            _top = new_elem;
 
            return;
        }
 
        new_elem->_next = _top;
        _top = new_elem;
    }
 
    bool pop(char& character)
    {
        if (_top == 0)
            return false;
 
        CharStackNode* del_elem = _top;
 
        character = _top->_character;
        _top = _top->_next;
 
        delete del_elem;
 
        return true;
    }
 
private:
    CharStackNode* _top;
};
 
void input_char_stack(CharStack& char_stack)
{
    char character;
 
    std::cout << "Fill char stack" << std::endl
        << "Enter characters or \'Ctrl+Z\'  \'Enter\' to exit:" << std::endl;
 
 
 
    while (std::cin >> character)
    {
        char_stack.push(character);
    }
}
 
size_t length_of_char_stack(CharStack& char_stack)
{
    CharStack copy(char_stack);
    char dummy;
    size_t len = 0;
 
    while (copy.pop(dummy))
        ++len;
 
 
    return len;
}
 
int main()
{
    CharStack stack1, stack2;
 
    input_char_stack(stack1);
    input_char_stack(stack2);
 
    std::cout << "Length of char stack 1: " << length_of_char_stack(stack1) << std::endl
        << "Length of char stack 2: " << length_of_char_stack(stack2) << std::endl;
 
 
    system("pause");
    return 0;
}
Миниатюры
Работа со стеками. создать в классе два стека  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2022, 07:13
Ответы с готовыми решениями:

Дан указатель Р1 на вершину непустого стека. Создать два новых стека, переместив в первый из них все элементы исходного стека с четными значениями, а
Помогите срочно составить задачу: Дан указатель Р1 на вершину непустого стека. Создать два новых...

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

Создать два новых стека, с четными и нечетными элементами первоначального стека
Дано указатель P1 на вершину непустого стека. Создать два новых стека , переместив в первый из них...

Задан указатель P1 на вершину непустого стека. Создать два новых стека
Добрый вечер, у меня возникла проблемка с такой программкой. Вывести в компонент Label. ...

Из одного стека, хранящего символы, создать два новых стека
Из одного стека, хранящего символы, создать два новых стека: один с латинскими буквами, удвоив...

5
4772 / 2581 / 893
Регистрация: 29.11.2010
Сообщений: 5,582
23.10.2022, 11:29 2
Немного непонятно, вам нужен готовый код по заданию или понять, что не так?

Цитата Сообщение от Kvadrokop Посмотреть сообщение
Что я нажимаю не так?
Ммм... Если у вас проблема с тем, что у вас после нажания Ctrl+Z ничего не происходит, то тут "всё сложно".
Если вкратце, то таким образом, как это реализовано в коде, просто не выйдет ввести два потока "до конца".
Грубо говоря, пока вы не "нажмётё Enter, Ctrl+Z, Enter" у вас функция input_char_stack не завершится.
А когда вы "нажмётё Enter, Ctrl+Z, Enter", следующий заход в функцию input_char_stack сразу же завершится.

Цитата Сообщение от Kvadrokop Посмотреть сообщение
- Сформировать два стека,содержащие последовательности символов.
В вашем задании нет ни слова про ввод данных.

Пара самых бросающихся в глаза замечаний.
Цитата Сообщение от Kvadrokop Посмотреть сообщение
_top == 0
Не используйте нетипизированный 0 для нулевого значения указателя. Используйте nullptr.

Цитата Сообщение от Kvadrokop Посмотреть сообщение
bool pop(char& character)
Хоть и вполне валидно, но в С++ принято разбивать операции просмотра вершины стека и его удаление на top и pop во избежание ненужных копирований.

Готовый код по заданию
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <iostream>
#include <stdexcept>
#include <utility>
 
template<typename T> // параметр класса -- тип хранимых данных
class Stack {
public:
    // конструктор
    Stack() : base(nullptr) {}
 
    // деструктор
    ~Stack() {
        clear();
    }
 
    // конструктор копирования
    Stack(const Stack<T> &other) : base(nullptr) {
        if (!other.isEmpty()) {
            Node *d = base = new Node{other.base->value, nullptr};
            Node *s = other.base->next;
            while (s != nullptr) {
                d = d->next = new Node{s->value, nullptr};
                s = s->next;
            }
        }
    }
 
    // move-constructor
    Stack(Stack<T> &&other) noexcept : base(std::exchange(other.base, nullptr)) {}
 
    Stack<T> &operator=(const Stack<T> &other) {
        if (this != &other) {
            clear();
            if (!other.isEmpty()) {
                Node *d = base = new Node{other.base->value, nullptr};
                Node *s = other.base->next;
                while (s != nullptr) {
                    d = d->next = new Node{s->value, nullptr};
                    s = s->next;
                }
            }
        }
        return *this;
    }
 
    // move-operator=
    Stack<T> &operator=(Stack<T> &&other) noexcept {
        if (this != &other) {
            base = std::exchange(other.base, base);
        }
        return *this;
    }
 
    // добавить значение в стек
    void push(const T &value) {
        base = new Node{value, base};
    }
 
    // удалить значение из стека
    void pop() {
        if (isEmpty()) {
            throw std::underflow_error("stack is empty");
        }
        Node *tmp = base;
        base = base->next;
        delete tmp;
    }
 
    // значение на вершине стека
    const T &top() const {
        if (isEmpty()) {
            throw std::underflow_error("stack is empty");
        }
        return base->value;
    }
 
    // проверка на пустоту стека
    bool isEmpty() const {
        return base == nullptr;
    }
 
    // очистка стека
    void clear() {
        while (base != nullptr) {
            Node *tmp = base;
            base = base->next;
            delete tmp;
        }
    }
 
private:
    // нода односвязного списка
    struct Node {
        T value;
        Node *next;
    };
    // указатель на вершину стека
    Node *base;
};
 
// рекурсивный обход стека
template<typename T>
std::size_t recursiveCount(Stack<T> &stack) {
    if (stack.isEmpty()) {
        return 0;
    }
    T value = stack.top();
    stack.pop();
    std::size_t result = 1 + recursiveCount(stack);
    stack.push(value);
    return result;
}
 
// обход стека через копию
template<typename T>
std::size_t copyCount(Stack<T> &stack) {
    Stack<T> copy = stack;
    std::size_t result = 0;
    while (!copy.isEmpty()) {
        copy.pop();
        ++result;
    }
    return result;
}
 
int main() {
 
    // Сформировать два стека,содержащие последовательности символов.
    Stack<char> a;
    Stack<char> b;
 
    for (char i = 'a'; i <= 'z'; ++i) {
        a.push(i);
    }
    for (char i = '0'; i <= '9'; ++i) {
        b.push(i);
    }
 
    // Подсчитать общее число элементов в стеках, предусмотреть восстановление их исходного расположения
    std::cout << "Count a: " << recursiveCount(a) << "\n"
        << "Count b: " << copyCount(b) << "\n";
 
    // а это просто вывод
    while (!a.isEmpty()) {
        std::cout << a.top() << "\n";
        a.pop();
    }
 
    while (!b.isEmpty()) {
        std::cout << b.top() << "\n";
        b.pop();
    }
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 02.03.2022
Сообщений: 39
23.10.2022, 15:50  [ТС] 3
lemegeton, подскажите, пожалуйста, а как реализовать ввод с клавиатуры? Все остальное я понял) спасибо
0
4772 / 2581 / 893
Регистрация: 29.11.2010
Сообщений: 5,582
23.10.2022, 16:14 4
Да мне-то откуда знать?
Сами придумайте, как отличить конец ввода первого стека от начала ввода второго.
Я ввод в плюсах не умею.

Как идея -- считать строку в std::string с помощью std::getline,
потом либо разобрать её посимвольно, либо положить её в std::stringstream, откуда считать уже посимвольно с помощью потоков.
И так дважды.

Добавлено через 53 секунды
Типа такого
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
#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>
 
 
int main() {
 
    std::string s;
 
    std::getline(std::cin, s);
    std::stringstream ssa(s);
 
    std::getline(std::cin, s);
    std::stringstream ssb(s);
 
    for (char c; ssa >> c;) {
        std::cout << c;
    }
    std::cout << "\n";
 
    for (char c; ssb >> c;) {
        std::cout << c;
    }
    std::cout << "\n";
 
    return 0;
}
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,492
Записей в блоге: 1
23.10.2022, 16:44 5
программу писал не автор
Подсчитать общее число элементов двух заданных стеков, предусмотреть восстановление их исходного расположения
0
4772 / 2581 / 893
Регистрация: 29.11.2010
Сообщений: 5,582
23.10.2022, 17:27 6
Да он и не утверждал обратного. )
0
23.10.2022, 17:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2022, 17:27
Помогаю со студенческими работами здесь

Из одного стека, хранящего символы, создать два новых стека
Из одного стека, хранящего символы, создать два новых стека: один с латинскими буквами, удвоив...

Создать два новых стека, переместив в первый из них все элементы исходного стека с четными значениями
Дан указатель P1 на вершину непустого стека. Создать два новых стека, переместив в первый из них...

Создать два новых стека, переместив в первый из них все элементы исходного стека с четными значениями
Дан указатель head1 на вершину непустого стека. Создать два новых стека, переместив в первый из них...

Создать два новых стека, переместив в первый из них все элементы исходного стека с чётными значениями, а второй - с нечётными
Дан указатель P1 на вершину непустого стека. Создать два новых стека, переместив в первый из них...

Создать два новых стека, переместив в первый из них все элементы исходного стека с четными значениями, а во второй — с нечетными
Дан указатель Р1 на вершину непустого стека. Создать два новых стека, переместив в первый из них...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru