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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
24.11.2012, 19:12     Реализовать кольцевой стек. #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
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");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
24.11.2012, 21:24     Реализовать кольцевой стек. #2
Если задача составить кольцевой стек, почему в тексте программы везде говорится об очереди?
На мой взгляд в программе неясности, которые мешают чтению и без того неудобоваримой программы без комментариев, как например условие цикла while (k<5), при том, что в теле цикла дополнительная проверка условия k>=size со значением size намного превышающем число 5. Ощущение, что автор сам не пробовал читать свою программу.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
24.11.2012, 21:41     Реализовать кольцевой стек. #3

Не по теме:

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



А что такое кольцевой стек? Чем он от обычного отличается?
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
24.11.2012, 22:46  [ТС]     Реализовать кольцевой стек. #4
это моя программа просто я пытался из очереди сделать кольцевой стек и вышла такая белиберда и по этому я здесь, кольцевой отличается от простой тем что в начало и конец можно добавлять элементы так же и удалять(по крайней мере я так понял)
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 10:30     Реализовать кольцевой стек. #5
Кольцевой - значит возобновляемый. Обычная очередь или обычный стек при чтении данных заканчиваются при невозможном повторном считывании тех же данных. На них считывание оказывает разрушающий характер. Задача закольцованности сделать возможным повторное считывание тех же данных.
Вам дали задание реализовать стек без классов и структур?
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 14:05  [ТС]     Реализовать кольцевой стек. #6
Цитата Сообщение от Kandelyabr Посмотреть сообщение
Кольцевой - значит возобновляемый. Обычная очередь или обычный стек при чтении данных заканчиваются при невозможном повторном считывании тех же данных. На них считывание оказывает разрушающий характер. Задача закольцованности сделать возможным повторное считывание тех же данных.
Вам дали задание реализовать стек без классов и структур?
Ааа то есть если мы удаляем первый элемент он идет в конец, а если с конца то в начало? Да, нам задали сделать без классов и структур.
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 14:28     Реализовать кольцевой стек. #7
По сути там ничего не удаляется. Всё дело в схеме считывания данных из массива.
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--];
}
Я здесь не привел экспериментальный кусок кода, где бы показывались вводимые в стек данные для сравнения с выводимыми из стека данными. Для большей наглядности можно сделать это самостоятельно, не так сложно.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 16:32  [ТС]     Реализовать кольцевой стек. #8
Значит, Вы показали ввод и вывод данных, а мне нужно написать часть кода в которой элементы переходят с начало в конец в с конца в начало?
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 16:53     Реализовать кольцевой стек. #9
ну для наглядности я бы добавил такую возможность. Не знаю, насколько это обязательно
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 17:08  [ТС]     Реализовать кольцевой стек. #10
просто я не понял как кольцо все же работает на практике

Добавлено через 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;
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 17:16     Реализовать кольцевой стек. #11
Обычный стек или обычная очередь подразумевают одноразовое считывание данных из массива, т.н. процессора данных. В этом случае не предусмотрен повтор считывания тех же данных, это упрощенный вариант с использованием индексов доступа к членам массива, при котором все индексы перебираются последовательно до крайнего без сброса индекса доступа, на этом всё и останавливается.
Кольцевой стек имеет возможность повторного считывания данных из массива. Стек представляет собой список, очередность доступа к данным определяется в порядке LIFO (First - in, Last - out, "первым вошел - последним вышел"). В коде имеется участок, который устанавливает индекс считывания по окончании записи данных в стек:
C++
1
getloc = putloc;
После этого начинается считывание из стека с его конца. При этом когда индекс последовательного считывания достигает нуля
C++
1
if(getloc == 0) getloc = putloc;
индекс считывания сбрасывается и считывание можно производить снова с конца списка.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 20:21  [ТС]     Реализовать кольцевой стек. #12
Хм, ну как то я себе представлял не так кольцевой стек

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

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

Добавлено через 1 час 42 минуты
я не знаю у меня в голове хаос, нам сказали что надо сделать функции push и pop как бы добавление и удаление элементов, ну эт я сделал на очереди и на стеку, а на кольце я не пойму как сделать, потому что кто то говорил что нужно добавлять элементы в начало и в конец но по сути это дек, а в кольце как Вы объяснили можно много раз одни и те же элементы брать... с этого я сделал вывод что это стек только когда все элементы удаляешь то они заново берутся с массива?
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 20:32     Реализовать кольцевой стек. #13
Вообще, стеки, очереди намного (на порядок примерно) удобней формировать классами, ну или структурами. Затем создается отдельный объект класса-стек для каждого набора данных и они существуют раздельно. Здесь же приходится затирать предыдущие данные в массиве и четко соблюдать диапазон. Вы можете определить свой набор данных, определив другой тип данных для массива Stack[]. Если же Вы не меняете тип данных, а просто хотите добавить еще один набор данных, определите вначале новый размер size для ваших данных, он будет опорным параметром для учета границ стека, за которые не выйдет программа, определите новый цикл, который будет вносить новые данные в стек. Если допустим, вы захотите внести осмысленное слово, вы можете воспользоваться командой strcpy(Stack, "нужное вам слово"); для подключения которой понадобится добавление в шапку программы #include <cstring>.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 20:53  [ТС]     Реализовать кольцевой стек. #14
ну на словах это все понятно, а вот в действии, хотя массив уже есть в вашей программе с количеством size но мне нужно просто сделать кольцо на примере массива с удалением и добавлением элементов, а как это реализовать я не могу понять
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 21:05     Реализовать кольцевой стек. #15
Вики вещает:
Стек (англ. stack — стопка) — структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху). Удаление элемента, называемое также выталкиванием (pop), тоже возможно только из вершины стека, при этом второй сверху элемент становится верхним.
Исходя из этого, можно с уверенностью сказать, что указанные методы реализованы практически, но с учетом того, что элементы не удаляются, а сохраняются, и только считывание перемещается по массиву по принципу стека. Здесь push = put, pop = get, при желании указанные функции можно переименовать в соответствии с требуемыми.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 21:11  [ТС]     Реализовать кольцевой стек. #16
но у нас стек, а нужен кольцевой стек с этими функциями и я не могу понять как это совместить
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 21:14     Реализовать кольцевой стек. #17
Это и есть кольцевой стек. Программа готова, больше ничего добавлять особой необходимости нет.
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 21:21  [ТС]     Реализовать кольцевой стек. #18
то есть вы мы просто записываем элементы, показываем что можно брать элементы с массива несколько раз и все? это кольцевой стек?
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 21:27     Реализовать кольцевой стек. #19
Именно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2012, 21:58     Реализовать кольцевой стек.
Еще ссылки по теме:

Помогите реализовать стек C++
C++ Реализовать стек и 3 оператора для работы с ним
C++ Используя кольцевой однонаправленный список, реализовать детскую считалку

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

Или воспользуйтесь поиском по форуму:
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 21:58  [ТС]     Реализовать кольцевой стек. #20
а как же можно сделать так чтобы элементы повторялись, то есть если задать массив 1 2 3...10 и написать что бы массив вывелся с 4 элемента и оно выведет 4 5 6 7 8 9 10 1 2 3 ?
Yandex
Объявления
25.11.2012, 21:58     Реализовать кольцевой стек.
Ответ Создать тему
Опции темы

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