С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/91: Рейтинг темы: голосов - 91, средняя оценка - 4.62
as
39 / 25 / 6
Регистрация: 14.02.2009
Сообщений: 355

Написать стек на базе массива, и на базе связного списка

26.09.2009, 13:53. Показов 19324. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Помогите пожалуйста !
Надо написать стек на базе массива, и на базе связного списка.
И еще очередь на базе связного списка.
Скиньте пожалуйста информацию как это сделать и реализовать!!!
Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.09.2009, 13:53
Ответы с готовыми решениями:

Написать программу, реализующую стек на базе односторонне связного списка и стандартные операции push, pop
Написать программу, реализующую стек на базе односторонне связного списка и стандартные операции со стеком на примере функций: ...

Реализация АТД стек на базе связного списка
Здравствуйте, очень прошу вашей помощи. Необходимо реализовать стек на базе связного списка, а я совершенно не понимаю как это сделать....

Динамическое программирование, стек на базе списка...
Доброе время суток... :) Имеется такой код (рабочий), реализация стека на базе списка: struct stack { int data; stack...

10
 Аватар для Sekt
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
26.09.2009, 14:44
Стэк на базе массива.
С новаротами
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
# include<iostream.h>
# include<process.h>
# include<conio.h>
# define SIZE 20
 
class stack
{
int a[SIZE];
int tos; // Top of Stack
public:
    stack();
    void push(int);
    int pop();
    int isempty();
    int isfull();
};
stack::stack()
{
tos=0; //Initialize Top of Stack
}
 
int stack::isempty()
{
return (tos==0?1:0);
}
int stack::isfull()
{
return (tos==SIZE?1:0);
}
 
void stack::push(int i)
{
if(!isfull())
{
a[tos]=i;
tos++;
}
else
{
 cerr<<"Stack overflow error !
Possible Data Loss !";
}
}
int stack::pop()
{
if(!isempty())
{
return(a[--tos]);
}
else
{
cerr<<"Stack is empty! What to pop...!";
}
return 0;
}
 
void main()
{
stack s;
int ch=1,num;
while(ch!=0)
{
    cout<<"Stack Operations Mani Menu
1.Push
2.Pop
3.IsEmpty
4.IsFull
0.Exit
 
";
    cin>>ch;
    switch(ch)
    {
    case 0:
        exit(1); //Normal Termination of Program
    case 1:
        cout<<"Enter the number to push";
        cin>>num;
        s.push(num);
        break;
    case 2:
        cout<<"Number popped from the stack is: "<<s.pop()<<endl;
        break;
    case 3:
        (s.isempty())?(cout<<"Stack is empty.
"):(cout<<"Stack is not empty.
");
        break;
    case 4:
        (s.isfull())?(cout<<"Stack is full.
"):(cout<<"Stack is not full.
");
        break;
    default:
        cout<<"Illegal Option.
Please try again
";
    }
}//end of while
getch();
}
1
Псевдо программист
 Аватар для R0mm
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
26.09.2009, 14:47
Попробуйте использовать опцию поиска по этому сайту.
0
as
39 / 25 / 6
Регистрация: 14.02.2009
Сообщений: 355
26.09.2009, 19:55  [ТС]
Реализацию в классе нашел уже.
Подскажите сто надо писать в ф-ии main , мне надо заполнить стек и вывести его на экран.
Подскажите пожалуйста , целый день ищу не могу найти.
0
Путешественница
 Аватар для MotherBoard
1250 / 478 / 11
Регистрация: 22.02.2009
Сообщений: 2,842
26.09.2009, 22:08
После подключения библиотек(что в самом верху)
C++
1
2
3
4
5
6
using namespace std;
int main()
{
cout<<"---------------------------";
return 0;
}
Насколько я знаю,именно функция cout выводит инфу в скобках"-" на экран. Вот только затрудняюсь ответить,что именно надо писать в этих скобках...
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
26.09.2009, 23:04
Друзья!
Вот эта штука реализует задачу с помощью связного списка.
За основу взял код Sekt.
Из него я убрал две функции:
int isempty();
int isfull();

И добавил одну vozvr
Остальные комментарии в тексте.
Для лёгкости тестирования SIZE== 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
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
# include<iostream>
# include<conio.h>
# define SIZE 3
using namespace std;
 
//Каждый элемент массива суть структура, состоящая из двух полей.
//Первое поле- САМО значение элемента массива
//Второе- указатель на следующую структуру
struct element {
 int el;
 element* pel;  
}; 
 
//Все функции будут работать с адресами элементов element. Это глобальная переменная,
//она содержит адрес структуры
element* adres_nulevogo_elementa;
 
 
class stack {
 
 private:
 element a [SIZE];
 //Индексы как в прошлом примере не нужны, будем обходиться  переменной pel
 
 public:
        stack();
        void push(int);
        int pop();
 
        //Эта функция возвращает значение a. И всё!.Она нужна будет тогда только, когда будем 
        //инициализировать статическую переменую adres_nulevogo_elementa и когда будем проверять
        //не пустой ли стек.
        element* vozvr () {return a;}
 
};
 
//+++++++++++++++++++++++++++++++++++++++++++++++Конструктор+++++++++++++++++++++++++++++++++++++++++
 
//Это конструктор
//При объявлении объекта типа stack все поля el переменных типа element устанавливаются в ноль
//А все поля pel переменных типа element содержат адреса СЛЕДУЮЩЕЙ ПЕРЕМЕННОЙ типа element
//На то он и связный список
//Делаем всё это дело в цикле
stack::stack(){
 
 int i= 0;
 
 for (; i< SIZE- 1; i++) {
  a[i].el= 0;
  a[i].pel= &a [i+1];
 }
 
 //Последний элемент заполняем отдельно, ибо второе его поле должно одержать нулевой указатель
 a [i].el= 0;
 a [i].pel= 0;
 
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
 
 
 
 
 
 
 
void stack::push(int i){
 
 //Здесь решено отказаться от использования функции isfull. Просто смотрим, куда
 //указывает переменная adres_nulevogo_elementa 
 
 if(adres_nulevogo_elementa) {
  adres_nulevogo_elementa->el= i;
 
  //Поле adres_nulevogo_elementa-> не запоняем, ибо оно уже заполнено конструктором.
  //А вот значение переменной adres_nulevogo_elementa изменяем
  adres_nulevogo_elementa= adres_nulevogo_elementa->pel;
 }
 else {
  cout<<"Stack overflow error !  Possible Data Loss !";
 }
}
 
 
 
 
 
 
int stack::pop(){
 
 //Здесь тоже решено отказаться от исполльзования функции isempty
 //Вместо этого смотрим, не на s [0] ли указывает adres_nulevogo_elementa
 if (adres_nulevogo_elementa!= a) {
 
  //Допустим, что стек не пуст. А это значит, что он либо полон, либо нет. Если стек полон, тогда
  //вот что делаем
  if (adres_nulevogo_elementa== 0) {
   adres_nulevogo_elementa= &a[SIZE-1] ;
  }
 
  //Ну, а если не полон то вот что. А если полон, то простая деинкременация не пойдёт, т. к. 
  //adres_nulevogo_elementa будет содержать 0, потому такие заморочки (см. инструкцию выше)
  else {
   adres_nulevogo_elementa--;
  }
  getchar ();
  return adres_nulevogo_elementa->el;
 }
 
 else {
  cerr<<"Stack is empty! What to pop...!";
 }
 return 0;
}
 
 
 
int main(){
stack s;
 
//Вот перво-наперво проинициализируем эту переменную
adres_nulevogo_elementa= s.vozvr(); 
 
int ch=1,num;
while(ch!=0) {
 
        cout<<"Stack Operations Mani Menu\n1.Push\n2.Pop\n3.IsEmpty\n4.IsFull\n0.Exit\n";
        cin>>ch;
 
        switch(ch) {
 
        case 0:
                exit(1); //Normal Termination of Program
        case 1:
                cout<<"Enter the number to push"<<endl;
                cin>>num;
                s.push(num);
                break;
        case 2:
                cout<<"Number popped from the stack is: "<<s.pop()<<endl;
                break;
        case 3:
                (adres_nulevogo_elementa== s.vozvr())?(cout<<"Stack is empty."):(cout<<"Stack is not empty.");
                break;
        case 4:
                (!adres_nulevogo_elementa->pel)?(cout<<"Stack is full."):(cout<<"Stack is not full.");
                break;
        default:
                cout<<"Illegal Option.Please try again";
        }
}//end of while
getch();
 return 0;
}
0
as
39 / 25 / 6
Регистрация: 14.02.2009
Сообщений: 355
27.09.2009, 21:47  [ТС]
Описание класса есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class Item> class STACK
{
private:
Item *s; int N;
public:
STACK(int maxN)
{s=new Item[maxN]; N=0;}
int empty() const
{return==0;}
void push(Item item)
{s[N++]=item;}
Item pop()
{return s[--N];}
};
А что писать в main() , как создать этот стек и вывести на печать???
0
 Аватар для Sekt
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
27.09.2009, 22:07
В
C++
1
2
main():
STACK<int>Stackobj.
0
as
39 / 25 / 6
Регистрация: 14.02.2009
Сообщений: 355
30.09.2009, 10:47  [ТС]
А как заполнить стек числами и вывести на печать???
0
Псевдо программист
 Аватар для R0mm
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
30.09.2009, 13:29
C++
1
2
3
main():
STACK<int>Stackobj.
Stackobj.push(5);
0
as
39 / 25 / 6
Регистрация: 14.02.2009
Сообщений: 355
30.09.2009, 18:08  [ТС]
Это получается, я загнал цифру 5?
А потом указатель становится +1 , и также следующие числа?
А как вывести на печать???

Добавлено через 1 час 22 минуты
Записал код:
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
#include <iostream>
#include <stdlib.h>
using namespace std;
 
template <class Item>class STACK
{
    private:
    Item *s; int N;
    public:
    STACK(int maxN)
    {s=new Item[maxN]; N=0;}
    int empty() const
    {return N==0;}
    void push(Item item)
    {s[N++]=item;}
    Item pop()
    {return s[--N];}
};
 
int main ()
{
    STACK<int>Mystack;
    Mystack.push(5);
    return 0;
}
выдает сообщение:
\its0701-2\main.cpp||In function `int main()':
\its0701-2\main.cpp|22|error: no matching function for call to `STACK<int>::STACK()'
\its0701-2\main.cpp|6|note: candidates are: STACK<int>::STACK(const STACK<int>&)
\its0701-2\main.cpp|11|note: STACK<Item>::STACK(int) [with Item = int]
помогите пожалуйста разобраться!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2009, 18:08
Помогаю со студенческими работами здесь

Стек на базе массива
Есть код #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; template &lt;class T&gt; class STACK ...

Стек на базе массива
Помогите написать программу реализующую стек на базе массива, в качестве базы берем массив из N элементов: S. Индекс вершины стека...

Стек на базе статического массива
Здравствуйте помогите, верней напишите за меня пожалуйста стек на базе статического массива. требования для массива: 1)тип элементов -...

Стек на базе динамического массива
У меня есть стек на базе массива. Как его переделать в стек на базе динамического массива??? // РЕАЛИЗАЦИЯ СТЕКА НА БАЗЕ МАССИВА const...

Создать базовый класс список. Реализовать на базе списка стек и очередь с виртуальными функциями вставки и вытаскивания
Здравствуйте, помогите пожалуйста разобраться что как работает в программе (напишите комментарии). Задание: Создать базовый класс...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru