Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
0 / 0 / 3
Регистрация: 28.10.2012
Сообщений: 157

Реализовать кольцевой стек.

24.11.2012, 19:12. Показов 5945. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
не могу сделать кольцевой стек, помогите или подскажите что можно сделать.

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
#include <iostream>
using namespace std;
 
int main()
{
    int val;
    int last;
    int const size = 100;
    int n = 1;
    int k = 0;
    int queue[size];
    cout<<"Enter the number of the first element"<<endl;
    cin>>val;
    int y = val;
    int top = val;
    if(val<=size)
    {
    while(k < 5)
    {       
            cout<<"Element "<< k + 1<<endl;
            cin>>n;
            if(n != 0)
            {
                queue[val - 1] = n;
                val++;
                last = val - 1;
                k++;
            }
        if(k>=size)
        {k = 0;}
    }
 
    system("pause");
    cout<<"Queue has the form:"<<endl;
    for(int i = 1; i <= k; i++)
    {
            cout<<queue[y - 1]<<" ";
            y++;
    }
    system("pause");
    cout<<"add one more element in the queue and remove the first element"<<endl;
    cout<<"The main element of the queue = "<<queue[top - 1]<<endl;
    cout<<"The last element of the queue = "<<queue[last - 1]<<endl;
    queue[last] = top;
 
        cout<<"Queue has the form:"<<endl;
    for(int i = 1; i <= k; i++)
    {
            cout<<queue[y-5]<<" ";
            y++;
    }
 
    system("pause");
 
    cout<<"add one more element in the queue and remove the last element"<<endl;
    cout<<"The main element of the queue = "<<queue[top]<<endl;
    cout<<"The last element of the queue = "<<queue[last]<<endl;
    queue[top] = last+1;
 
    cout<<"Queue has the form:"<<endl;
    for(int i = 1; i <= k; i++)
    {
            cout<<queue[y - 5]<<" ";
            y++;
    }
    }   
    else
    {cout<<"Enter a number less than the maximum size of the array"<<endl;}
    system("pause");
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2012, 19:12
Ответы с готовыми решениями:

Односвязный кольцевой список, реализовать
Помогите написать и реализовать кольцевой список

Реализовать кольцевой список типа char
Создать кольцевой список и реализовать следующие функции: 1) Функции для создания нового списка и его удаления. 2) Функции добавления...

STL: реализовать кольцевой упорядоченный двусвязный список
Добрый вечер всем кто открыл эту вкладку! Надо реализовать кольцевой упорядоченный двозвязний список на STL + некоторые функции работы с...

21
7 / 7 / 1
Регистрация: 03.04.2012
Сообщений: 25
24.11.2012, 21:24
Если задача составить кольцевой стек, почему в тексте программы везде говорится об очереди?
На мой взгляд в программе неясности, которые мешают чтению и без того неудобоваримой программы без комментариев, как например условие цикла while (k<5), при том, что в теле цикла дополнительная проверка условия k>=size со значением size намного превышающем число 5. Ощущение, что автор сам не пробовал читать свою программу.
1
2395 / 1925 / 763
Регистрация: 27.07.2012
Сообщений: 5,569
24.11.2012, 21:41

Не по теме:

Цитата Сообщение от Kandelyabr Посмотреть сообщение
Если задача составить кольцевой стек, почему в тексте программы везде говорится об очереди?
Потому что у одногруппника было задание про очередь. Одногруппнику сделали, а топикстартеру - нет. :) Вот поэтому он и здесь



А что такое кольцевой стек? Чем он от обычного отличается?
0
0 / 0 / 3
Регистрация: 28.10.2012
Сообщений: 157
24.11.2012, 22:46  [ТС]
это моя программа просто я пытался из очереди сделать кольцевой стек и вышла такая белиберда и по этому я здесь, кольцевой отличается от простой тем что в начало и конец можно добавлять элементы так же и удалять(по крайней мере я так понял)
0
7 / 7 / 1
Регистрация: 03.04.2012
Сообщений: 25
25.11.2012, 10:30
Кольцевой - значит возобновляемый. Обычная очередь или обычный стек при чтении данных заканчиваются при невозможном повторном считывании тех же данных. На них считывание оказывает разрушающий характер. Задача закольцованности сделать возможным повторное считывание тех же данных.
Вам дали задание реализовать стек без классов и структур?
0
0 / 0 / 3
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 14:05  [ТС]
Цитата Сообщение от Kandelyabr Посмотреть сообщение
Кольцевой - значит возобновляемый. Обычная очередь или обычный стек при чтении данных заканчиваются при невозможном повторном считывании тех же данных. На них считывание оказывает разрушающий характер. Задача закольцованности сделать возможным повторное считывание тех же данных.
Вам дали задание реализовать стек без классов и структур?
Ааа то есть если мы удаляем первый элемент он идет в конец, а если с конца то в начало? Да, нам задали сделать без классов и структур.
0
7 / 7 / 1
Регистрация: 03.04.2012
Сообщений: 25
25.11.2012, 14:28
По сути там ничего не удаляется. Всё дело в схеме считывания данных из массива.
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
#include <iostream>
using namespace std;
 
//Разместим основные переменные и сам массив стека
//в глобальной области видимости для простоты обращения к функциям
 
const int maxsize = 100; //максимальный размер стека
char Stack[maxsize];
int size;
int putloc = 0, getloc;
//прототипы функций обработки стека
void put(char ch); //функция "положить в стек"
char get(); //функция "взять из стека"
 
int main()
{
    size = 26; //размер стека для вводимых данных, перед новым набором данных должен устанавливаться вручную
    int i;
    char ch;
    cout << "We enter a symbols in the stack. \n";
 
    for(i=0; i<26; i++) { //цикл внесения символов в стек
        put('A' + i);
    }
 
    cout << "Content the stack: "; //выводим содержимое стека
    for(i=0; i<26; i++) {
        ch = get();
        if(ch!=0) cout << ch;
    }
 
    cout << "\nRepeat ouput content the stack: ";
    for(i=0; i<26; i++) {   //демонстрируем возможность
        ch = get();       //повторного извлечения данных из стека
        if(ch!=0) cout << ch;
    }
    
    return 0;
}
 
void put(char ch) {
    if(putloc == size) {
        cout << "-- The Stack is full.\n";
        return;
    }
    putloc++;
    getloc = putloc;
    Stack[putloc] = ch;
}
 
char get() {
    if(getloc == 0) getloc = putloc;
    return Stack[getloc--];
}
Я здесь не привел экспериментальный кусок кода, где бы показывались вводимые в стек данные для сравнения с выводимыми из стека данными. Для большей наглядности можно сделать это самостоятельно, не так сложно.
1
0 / 0 / 3
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 16:32  [ТС]
Значит, Вы показали ввод и вывод данных, а мне нужно написать часть кода в которой элементы переходят с начало в конец в с конца в начало?
0
7 / 7 / 1
Регистрация: 03.04.2012
Сообщений: 25
25.11.2012, 16:53
ну для наглядности я бы добавил такую возможность. Не знаю, насколько это обязательно
0
0 / 0 / 3
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 17:08  [ТС]
просто я не понял как кольцо все же работает на практике

Добавлено через 4 минуты
просто я так понял у Вас в программе выводится английский алфавит? и я не понял к чему два раза повторяется это, а точнее как это извлечение данных работает если там ничего не происходит

C++
1
2
3
4
5
6
7
8
9
cout << "Content the stack: "<<endl; //выводим содержимое стека
    for(i=0; i<10; i++) {
        a = get();
        if(a!=0) cout << a<<endl;;
    }
    cout << "\nRepeat ouput content the stack: ";
    for(i=0; i<10; i++) {   //демонстрируем возможность
        a = get();       //повторного извлечения данных из стека
        if(a!=0) cout << a<<endl;
0
7 / 7 / 1
Регистрация: 03.04.2012
Сообщений: 25
25.11.2012, 17:16
Обычный стек или обычная очередь подразумевают одноразовое считывание данных из массива, т.н. процессора данных. В этом случае не предусмотрен повтор считывания тех же данных, это упрощенный вариант с использованием индексов доступа к членам массива, при котором все индексы перебираются последовательно до крайнего без сброса индекса доступа, на этом всё и останавливается.
Кольцевой стек имеет возможность повторного считывания данных из массива. Стек представляет собой список, очередность доступа к данным определяется в порядке LIFO (First - in, Last - out, "первым вошел - последним вышел"). В коде имеется участок, который устанавливает индекс считывания по окончании записи данных в стек:
C++
1
getloc = putloc;
После этого начинается считывание из стека с его конца. При этом когда индекс последовательного считывания достигает нуля
C++
1
if(getloc == 0) getloc = putloc;
индекс считывания сбрасывается и считывание можно производить снова с конца списка.
1
0 / 0 / 3
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 20:21  [ТС]
Хм, ну как то я себе представлял не так кольцевой стек

Добавлено через 8 минут
и это все? то есть ни каких удалений и добавлений?

Добавлено через 40 минут
то есть если вводишь например 10 символов 1 2 3... и когда пишешь что бы отчет был с 4 символа то оно выводит 4 5 6 7 8 9 10 1 2 3 ?

Добавлено через 1 час 42 минуты
я не знаю у меня в голове хаос, нам сказали что надо сделать функции push и pop как бы добавление и удаление элементов, ну эт я сделал на очереди и на стеку, а на кольце я не пойму как сделать, потому что кто то говорил что нужно добавлять элементы в начало и в конец но по сути это дек, а в кольце как Вы объяснили можно много раз одни и те же элементы брать... с этого я сделал вывод что это стек только когда все элементы удаляешь то они заново берутся с массива?
0
7 / 7 / 1
Регистрация: 03.04.2012
Сообщений: 25
25.11.2012, 20:32
Вообще, стеки, очереди намного (на порядок примерно) удобней формировать классами, ну или структурами. Затем создается отдельный объект класса-стек для каждого набора данных и они существуют раздельно. Здесь же приходится затирать предыдущие данные в массиве и четко соблюдать диапазон. Вы можете определить свой набор данных, определив другой тип данных для массива Stack[]. Если же Вы не меняете тип данных, а просто хотите добавить еще один набор данных, определите вначале новый размер size для ваших данных, он будет опорным параметром для учета границ стека, за которые не выйдет программа, определите новый цикл, который будет вносить новые данные в стек. Если допустим, вы захотите внести осмысленное слово, вы можете воспользоваться командой strcpy(Stack, "нужное вам слово"); для подключения которой понадобится добавление в шапку программы #include <cstring>.
1
0 / 0 / 3
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 20:53  [ТС]
ну на словах это все понятно, а вот в действии, хотя массив уже есть в вашей программе с количеством size но мне нужно просто сделать кольцо на примере массива с удалением и добавлением элементов, а как это реализовать я не могу понять
0
7 / 7 / 1
Регистрация: 03.04.2012
Сообщений: 25
25.11.2012, 21:05
Вики вещает:
Стек (англ. stack — стопка) — структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху). Удаление элемента, называемое также выталкиванием (pop), тоже возможно только из вершины стека, при этом второй сверху элемент становится верхним.
Исходя из этого, можно с уверенностью сказать, что указанные методы реализованы практически, но с учетом того, что элементы не удаляются, а сохраняются, и только считывание перемещается по массиву по принципу стека. Здесь push = put, pop = get, при желании указанные функции можно переименовать в соответствии с требуемыми.
1
0 / 0 / 3
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 21:11  [ТС]
но у нас стек, а нужен кольцевой стек с этими функциями и я не могу понять как это совместить
0
7 / 7 / 1
Регистрация: 03.04.2012
Сообщений: 25
25.11.2012, 21:14
Это и есть кольцевой стек. Программа готова, больше ничего добавлять особой необходимости нет.
0
0 / 0 / 3
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 21:21  [ТС]
то есть вы мы просто записываем элементы, показываем что можно брать элементы с массива несколько раз и все? это кольцевой стек?
0
7 / 7 / 1
Регистрация: 03.04.2012
Сообщений: 25
25.11.2012, 21:27
Именно.
1
0 / 0 / 3
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 21:58  [ТС]
а как же можно сделать так чтобы элементы повторялись, то есть если задать массив 1 2 3...10 и написать что бы массив вывелся с 4 элемента и оно выведет 4 5 6 7 8 9 10 1 2 3 ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.11.2012, 21:58
Помогаю со студенческими работами здесь

Используя кольцевой однонаправленный список, реализовать детскую считалку
Всем привет. Есть задача: Используя кольцевой однонаправленный список, реализовать детскую считалку — N ребят расположены по кругу, начав...

Реализовать стек
Реализация стека на базе массива Добавлено через 4 минуты На языке си написать программу которая реализовывала стек на базе массива

Реализовать стек
Реализовать стек с &quot;проталкиванием&quot;: вершина стека всегда находится в первой ячейке массива; при &quot;заталкивании&quot; в стек следующего...

Реализовать стек
Реализовать стек, длина стека вводится пользователем, с функциями добавления и удаления элементов

Реализовать кольцевой список. Как закольцевать список обычный?
Помогите пожалуйста реализовать кольцевой список. Я так понимаю, он может быть двусвязным и односвязным? Меня интересует односвязный....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru