Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 05.09.2019
Сообщений: 1
1

Как поменять первый и последний элемент стека?

05.09.2019, 17:58. Показов 4111. Ответов 8
Метки нет (Все метки)

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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#include "pch.h"
#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
const int N = 10;
struct Stec
{
    char a[15];
    int inf;
    Stec *next;
};
bool checker(char *str)
{
    if (strlen(str) == 0) return 0;
    int counter = 0;
    for (int i = 0; i < strlen(str); i++)
    {
        if (str[i] == '.')
        {
            counter++;
        }
        if (((str[i]<'0' || str[i]>'9') && str[i] != '.') || (str[i] == '.' && counter > 1))
        {
            return 0;
        }
    }
    return 1;
}
double checkType()
{
    float finish;
    char buffer[1000];
    do
    {
        strcpy_s(buffer, "");
        gets_s(buffer);
        if (!checker(buffer)) cout << "Некорректный ввод, введите ещё раз: ";
    } while (!checker(buffer));
    finish = atof(buffer);
    return finish;
}
void putElemFirst(Stec **head, char *d)
{
    Stec *temp = (Stec*)malloc(sizeof(Stec));
    temp->next = *head;
    strcpy_s(temp->a, d);
    *head = temp;
}
Stec *pop_stec(Stec **head)
{
    Stec *out;
    out = *head;
    *head = (*head)->next;
    return out;
}
 
void output(Stec *head)
{
    Stec *newHead = NULL;
    Stec *temp = NULL;
    int count = 1;
    while (head)
    {
        temp = pop_stec(&head);
        cout << "Элемент №" << count << ": " << temp->a << endl;
        cout << "==========================" << endl;
        putElemFirst(&newHead, temp->a);
        count++;
    }
    while (newHead)
    {
        temp = pop_stec(&newHead);
        putElemFirst(&head, temp->a);
    }
    free(temp);
}
void deleteElem(Stec **head)
{
    Stec *pntr = *head;
    *head = pntr->next;
    free(pntr);
}
void deleteStec(Stec *head)
{
    while (head) deleteElem(&head);
}
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Stec *head = NULL;
    int num;
    do
    {
        system("cls");
        cout << "1 - Добавить элемент" << endl
            << "2 - Печатать все элементы" << endl
            << "3 - Удалить элемент" << endl
            << "4 - Очистить стек" << endl
            << "5 - Выход" << endl
            << "6 - Задание" << endl
            << "Выберите операцию >> ";
        num = checkType();
        switch (num)
        {
        case 1:
        {
            system("cls");
            char p[15];
            cout << "Введите элемент: ";
            gets_s(p);
            putElemFirst(&head, p);
        }
        break;
        case 2:
        {
            if (head == NULL)
            {
                do
                {
                    system("cls");
                    cout << "Стек пуст!" << endl;
                    cout << "Для выхода нажмите <<esc>>";
                } while (_getch() != 27);
            }
            else
            {
                do
                {
                    system("cls");
                    output(head);
                    cout << "Для выхода в меню нажмите <<esc>>";
                } while (_getch() != 27);
            }
        }
        break;
        case 3:
        {
            if (head == NULL)
            {
                do
                {
                    system("cls");
                    cout << "Стек пуст!" << endl;
                    cout << "Для выхода нажмите <<esc>>";
                } while (_getch() != 27);
            }
            else
            {
                deleteElem(&head);
                do
                {
                    system("cls");
                    cout << "Элемент успешно удалён" << endl;
                    cout << "Для выхода в меню нажмите <<esc>>";
                } while (_getch() != 27);
            }
        }
        break;
        case 4:
        {
            if (head == NULL)
            {
                do
                {
                    system("cls");
                    cout << "Стек пуст!" << endl;
                    cout << "Для выхода нажмите <<esc>>";
                } while (_getch() != 27);
            }
            else
            {
                do
                {
                    system("cls");
                    deleteStec(head);
                    head = NULL;
                    cout << "Стек очищен" << endl;
                    cout << "Для выхода в меню нажмите <<esc>>";
                } while (_getch() != 27);
            }
        }
        break;
        case 5:
        {
            return 0;
            break;
        }
        case 6:
        {
 
        }
        }
    } while (num >= 1 && num <= 5);
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2019, 17:58
Ответы с готовыми решениями:

Поменять местам первый и последний элементы стека
Ввести символы, формируя из них стек. Поменять местам первый и последний элементы стека (через...

Поменять местами первый и последний элемент списка
Добавить в шаблон класса CList метод, меняющий местами первый и последний элемент списка. ...

Поменять местами последний нулевой элемент и первый минимальный
Всем доброго времени суток. Помогите пожалуйста с решением задачки. Ну ооочень надо. Заранее спасибо

Первый элемент массива поменять с минимальным, а последний с максимальным
Добрый вечер. Мой знакомый написал программу для определения максимального и минимального элемента...

8
Нарушитель
1486 / 1288 / 485
Регистрация: 16.08.2014
Сообщений: 5,415
Записей в блоге: 1
05.09.2019, 19:23 2
Цитата Сообщение от Филипп1 Посмотреть сообщение
как поменять первый и последний элемент стека
если возникает сия нужда, то стек использовать не нужно. либо называть структуру с подобными операциями стеком будет не правильно.
0
1282 / 899 / 479
Регистрация: 05.12.2013
Сообщений: 2,961
05.09.2019, 20:20 3
Так примерно

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
#include <iostream>
#include <vector>
using namespace std;
 
class Stack{
public:
    Stack():head(nullptr), len(0){}
 
    int Pop()
    {
        if (head)
        {
            TStack *cur = head;
            TStack *prev = nullptr;
 
            while (cur->tst)
            {
                prev = cur;
                cur = cur->tst;
            }
 
            if (prev)
                prev->tst = nullptr;
            int n = cur->val;
            delete cur;
            len--;
            if(len == 0)
            {
               head = nullptr;
               tail = nullptr;
            }
            return n;
        }
        return 0;
    }
 
    void Push(int n)
    {
        TStack* temp = new TStack();
 
        if(head == nullptr)
            head = temp;
        else
            tail->tst = temp;
        temp->val = n;
        temp->tst = nullptr;
        tail = temp;
        len++;
    }
 
    int Peek()
    {
        TStack* tmp = head;
        while(tmp != tail){
            tmp = tmp->tst;
        }
        return tmp->val;
    }
 
    int length()
    {
        return len;
    }
 
    void print()
    {
        TStack* tmp = head;
        while(tmp){
            cout << tmp->val << " ";
            tmp = tmp->tst;
        }
        cout << endl;
    }
 
private:
    struct TStack{
        int val;
        TStack* tst;
    };
    TStack* head;
    TStack* tail;
    int len;
};
 
void replace_first_and_last(Stack& st)
{
    if(st.length() == 1){
        return;
    }
 
    if(st.length() == 2){
        int last = st.Pop();
        int first = st.Pop();
        st.Push(last);
        st.Push(first);
        return;
    }
 
    int last, first;
    vector<int> temp;
    last = st.Pop();
    while(st.length() > 1)
        temp.push_back(st.Pop());
    first = st.Pop();
 
    st.Push(last);
    for (vector<int>::reverse_iterator it = temp.rbegin() ; it!=temp.rend() ; ++it)
            st.Push(*it);
    st.Push(first);
}
 
int main()
{
    Stack st;
    st.Push(5);
    st.Push(6);
    st.Push(8);
    st.Push(3);
    st.print();
    replace_first_and_last(st);
    st.print();
 
    return 0;
}
0
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
05.09.2019, 20:21 4
Цитата Сообщение от Филипп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
struct StackNode
{
    char a[15];
    int inf;
    SteckNode* next;
};
 
struct Stack
{
    StackNode *m_head = nullptr;
    StackNode *m_last = nullptr;
};
 
inline
void putElemFirst(Stack &stack, char* d)
{
    Stec* temp = (Stec*)malloc(sizeof(Stec));
    temp->next = stack.m_head;
    strcpy_s(temp->a, d);
    if (stack.m_head)
        stack.m_head = temp;
    else 
        stack.m_head = stack.m_last = temp;
}
0
10 / 32 / 15
Регистрация: 29.04.2014
Сообщений: 223
05.09.2019, 20:31 5
Используйте лучше swap (STL)
0
1282 / 899 / 479
Регистрация: 05.12.2013
Сообщений: 2,961
05.09.2019, 20:44 6
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Но стек нужно реализовать немного по-другому, добавить указатель на последний элемент
Stack это разновидность контейнера в которым, можно добавить элемент в конец или удалить последний элемент, реализации, конечно, бывают разные, но ваши 2 указателя в структуре не являются стеком как бы вы эту структуру не называли
1
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
05.09.2019, 21:06 7
Цитата Сообщение от ТабуретY Посмотреть сообщение
Stack это разновидность контейнера в которым, можно добавить элемент в конец или удалить последний элемент, реализации, конечно, бывают разные, но ваши 2 указателя в структуре не являются стеком как бы вы эту структуру не называли
А что, здесь нельзя добавить элемент в конец или удалить последний элемент? В чём отличие от того, что ты называешь "Stack"?
0
1282 / 899 / 479
Регистрация: 05.12.2013
Сообщений: 2,961
05.09.2019, 21:11 8
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А что, здесь нельзя добавить элемент в конец или удалить последний элемент?
В stack'е можно что-то делать только с последним добавленным элементом
0
6738 / 4537 / 1839
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
05.09.2019, 21:17 9
Цитата Сообщение от ТабуретY Посмотреть сообщение
В stack'е можно что-то делать только с последним добавленным элементом
Да ладно. Кто-то тебе запретил?
Т.е., если я знаю количество элементов в стеке, он перестаёт быть стеком?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2019, 21:17

Поменять первый максимальный и последний минимальный элемент массива
Посмотрите, пожалуйста, где тут ошибка #include &lt;iostream&gt; using namespace std; int...

Поменять местами первый из наибольших элементов и последний элемент.
Дан массив размерность n (n &lt; 50), необходимо поменять местами первый из наибольших элементов и...

Поменять местами первый и последний элемент символьного массива
Надо поменять местами первый и последний символ через функцию, если не через функцию делать все...

Поменять местами первый и последний элемент массива (исправить код)
Почему массив не не меняет первый и последний элемент местами? #include &lt;iostream&gt; #include...


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

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

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