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

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

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

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

24.11.2012, 19:12. Просмотров 1475. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2012, 19:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализовать кольцевой стек. (C++):

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

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

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

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

Реализовать указанные функции-члены для пользовательского класса "Кольцевой двусвязный список" - C++
Сообственно сабж. У списка два закрытых поля: tail-это узел следующий за &quot;последним&quot;(условно,ибо список -кольцо. в tail-е лежит мусор)...

Помогите реализовать стек - C++
Здравствуйте. Помогите, пожалуйста, решить задачу: Реализуйте структуру данных &quot;стек&quot;, реализовав все указанные здесь методы при помощи...

21
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
24.11.2012, 21:24 #2
Если задача составить кольцевой стек, почему в тексте программы везде говорится об очереди?
На мой взгляд в программе неясности, которые мешают чтению и без того неудобоваримой программы без комментариев, как например условие цикла while (k<5), при том, что в теле цикла дополнительная проверка условия k>=size со значением size намного превышающем число 5. Ощущение, что автор сам не пробовал читать свою программу.
1
John Prick
805 / 738 / 146
Регистрация: 27.07.2012
Сообщений: 2,110
Завершенные тесты: 3
24.11.2012, 21:41 #3

Не по теме:

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



А что такое кольцевой стек? Чем он от обычного отличается?
0
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
24.11.2012, 22:46  [ТС] #4
это моя программа просто я пытался из очереди сделать кольцевой стек и вышла такая белиберда и по этому я здесь, кольцевой отличается от простой тем что в начало и конец можно добавлять элементы так же и удалять(по крайней мере я так понял)
0
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 10:30 #5
Кольцевой - значит возобновляемый. Обычная очередь или обычный стек при чтении данных заканчиваются при невозможном повторном считывании тех же данных. На них считывание оказывает разрушающий характер. Задача закольцованности сделать возможным повторное считывание тех же данных.
Вам дали задание реализовать стек без классов и структур?
0
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 14:05  [ТС] #6
Цитата Сообщение от Kandelyabr Посмотреть сообщение
Кольцевой - значит возобновляемый. Обычная очередь или обычный стек при чтении данных заканчиваются при невозможном повторном считывании тех же данных. На них считывание оказывает разрушающий характер. Задача закольцованности сделать возможным повторное считывание тех же данных.
Вам дали задание реализовать стек без классов и структур?
Ааа то есть если мы удаляем первый элемент он идет в конец, а если с конца то в начало? Да, нам задали сделать без классов и структур.
0
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--];
}
Я здесь не привел экспериментальный кусок кода, где бы показывались вводимые в стек данные для сравнения с выводимыми из стека данными. Для большей наглядности можно сделать это самостоятельно, не так сложно.
1
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 16:32  [ТС] #8
Значит, Вы показали ввод и вывод данных, а мне нужно написать часть кода в которой элементы переходят с начало в конец в с конца в начало?
0
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 16:53 #9
ну для наглядности я бы добавил такую возможность. Не знаю, насколько это обязательно
0
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;
0
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;
индекс считывания сбрасывается и считывание можно производить снова с конца списка.
1
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 как бы добавление и удаление элементов, ну эт я сделал на очереди и на стеку, а на кольце я не пойму как сделать, потому что кто то говорил что нужно добавлять элементы в начало и в конец но по сути это дек, а в кольце как Вы объяснили можно много раз одни и те же элементы брать... с этого я сделал вывод что это стек только когда все элементы удаляешь то они заново берутся с массива?
0
Kandelyabr
7 / 7 / 0
Регистрация: 03.04.2012
Сообщений: 15
25.11.2012, 20:32 #13
Вообще, стеки, очереди намного (на порядок примерно) удобней формировать классами, ну или структурами. Затем создается отдельный объект класса-стек для каждого набора данных и они существуют раздельно. Здесь же приходится затирать предыдущие данные в массиве и четко соблюдать диапазон. Вы можете определить свой набор данных, определив другой тип данных для массива Stack[]. Если же Вы не меняете тип данных, а просто хотите добавить еще один набор данных, определите вначале новый размер size для ваших данных, он будет опорным параметром для учета границ стека, за которые не выйдет программа, определите новый цикл, который будет вносить новые данные в стек. Если допустим, вы захотите внести осмысленное слово, вы можете воспользоваться командой strcpy(Stack, "нужное вам слово"); для подключения которой понадобится добавление в шапку программы #include <cstring>.
1
Liberation
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 157
25.11.2012, 20:53  [ТС] #14
ну на словах это все понятно, а вот в действии, хотя массив уже есть в вашей программе с количеством size но мне нужно просто сделать кольцо на примере массива с удалением и добавлением элементов, а как это реализовать я не могу понять
0
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, при желании указанные функции можно переименовать в соответствии с требуемыми.
1
25.11.2012, 21:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2012, 21:05
Привет! Вот еще темы с ответами:

Реализовать стек с помощью массива - C++
Попытался реализовать стек с помощью массива. Но почему то ничего не происходит, так же попробовал пользоваться template&lt;typename T&gt;,...

Реализовать стек с использованием односвязного списка - C++
Народ, у меня в лабораторной работе задание: реализовать стек с помощью односвязного списка. Я не очень понял, что это за стеки и списки и...

Помогите реализовать стек на основе массива - C++
помогите с задачачей по с++ 3. Реализуйте стек на основе массива.

Реализовать стек. Определение правильного скобочного выражения - C++
1. Разработать и создать набор функций для пользовательского типа данных типа стек 2. С помощью стека решить предложенные задачи: ...


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

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

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