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

Статический и динамический стек - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.79
privit_91
13 / 13 / 0
Регистрация: 06.11.2012
Сообщений: 79
20.01.2013, 16:34     Статический и динамический стек #1
Необходимо разработать программу, реализующую алгоритм стека (10 элементов). Решение необходимо представить в двух вариантах: статическом (на основе массива структур) и динамическом. В качестве элемента стека выбрать структуру жд_вокзал:
i. Номер (ключ)
ii. Станция отправления
iii. Станция назначения
iv. Дата/время отправления
v. Дата/время прибытия


Предусмотреть многоуровневое меню:
1) Заполнение стека: с консоли (циклически)
2) Удаление элемента из стека (циклически) безвозвратно
3) Очистка стека (с выводом удаляемых элементов) безвозвратно
4) Вывод элементов, содержащихся в стеке на экран
5) Вывод количества элементов в стеке
6) Выход


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
#include <iostream.h>
struct zd_vok // Структура жд вокзал
{ int nomer;
  char stan_otp[55];
  char stan_naz[55] ;
  char dat_vre_otp[30] ;
  char dat_vre_naz[30] ;
};
struct STACK //
{ zd_vok info; //поле типа структура
  STACK *next; //указатель на след. элемент
};
 
void Add(STACK **stack, zd_vok d) // Добавление элементов в стек
{ STACK *tmp = new STACK;
  tmp->info=d;
  tmp->next=*stack;
  *stack=tmp;
}
void Del(STACK **stack) //Удаление элементов со стека
{ STACK *tmp=*stack;
  *stack=(*stack)->next;
  delete tmp;
  return tmp;
}
int Empty(STACK *stack) //Проверка стека
{ if (stack==NULL) return 0; else return 1;
}
void ClearAll(STACK **stack) //Удаление стека
{ STACK *tmp;
  while(*stack!=NULL)
  { tmp=*stack;
    *stack=(*stack)->next;
    delete tmp;
  }
}
void Show(STACK *stack)
{ STACK *tmp=stack;
  while(tmp!=NULL)
  { cout << "Nomer: "<< tmp->info.nomer << endl;
    cout << "Stancia otpravlenia: "<< tmp->info.stan_otp << endl;
    cout << "Stancia naznachenia: "<< tmp->info.stan_naz << endl;
    cout << "Data vremia otpravlenia: "<< tmp->info.dat_vre_otp << endl;
    cout << "Data vramia naznachenia: "<< tmp->info.dat_vre_naz <<endl<<endl;
    tmp=tmp->next;
   }
}
 
 
void main()
{
 
    STACK *stack=NULL;
    int num,Key;
    STACK info;
    zd_vok d;
    int otv;
 
int i=1;
cin>>otv;
switch(otv)
{ case 1:
    { do
        { 
            cout<<"Nomer: - " <<endl;
            cin>>d.nomer;
            cout<<"Stancia otpravlenia: - "<<endl;
            cin>>d.stan_otp;
            cout<<"Stancia naznachenia: - "<<endl;
            cin>>d.stan_naz;
            cout<<"Data vremia otp: - "<<endl;
            cin>>d.dat_vre_otp;
            cout<<"Data vremia naz: -"<<endl;
            cin>>d.dat_vre_naz;
            Add(&stack,d);
            cout << endl << "Element dobablen" << endl;
            cout << endl << "Elementi steka"<<i << endl << endl;
            Show(stack);
            i++;
        } while (i<3);
 
}
};
 
}

Скажите я верно делаю ?
Не могу понять статически (на основе массива структур) вариант как его сделать? Буду очень признателен за помощь .
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 16:34     Статический и динамический стек
Посмотрите здесь:

C++ Как перевести статический массив в динамический?
C++ Статический и динамический экземпляры класса
C++ динамический стек (перегрузить операции +, +=, -= в динами)
Переделать статический массив в динамический C++
Двумерный массив (поменять статический массив на динамический) C++
Переделать статический массив в динамический C++
Переделать статический массив в динамический C++
Нужно переделать статический массив в динамический C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.01.2013, 18:30     Статический и динамический стек #2
ну вот динамический вариант у вас похоже на основе односвязного списка. когда вы добавляете элемент в стек, в динамической памяти создается узел и в него копируется значение.
статический - это я так понимаю не надо ничего динамически выделять. зарезервировать с самого начала в классе стека массив из десяти элементов и заполнять его по мере добавления элементов с ведением счетсчика заполненных ячеек этого массива. как только места в этом массиве не хватает - значит добавление элемента фейлится. вот как-то так мне это видится.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
20.01.2013, 18:51     Статический и динамический стек #3
Цитата Сообщение от privit_91 Посмотреть сообщение
Скажите я верно делаю ?
Похоже на то... Но все-таки я посоветовал бы сделать следующим образом:
1) переименовать стрктуру STACK в Node
C++
1
2
3
4
5
struct Node
{ 
    zd_vok info; //поле типа структура
    Node *next; //указатель на след. элемент
};
2) сделать отдельную структуру для представления стека
C++
1
2
3
4
struct Stack 
{
    Node* top; // указатель на вершину стека
};
Таким образом:
1) код станет намного более прозрачным, например
C++
1
2
3
4
5
6
7
8
9
void Add(Stack& stack, const zd_vok& d) // Добавление элементов в стек
{ 
    Node *tmp = new Node;
    
    tmp->info = d;
    tmp->next = stack.top;
    
    stack.top = tmp;
}
2) При создании стека на основе статического массива ничего не нужно будет менять в функции main, все функции для работы со стеком останутся те же, изменится только их реализация.
Цитата Сообщение от privit_91 Посмотреть сообщение
Не могу понять статически (на основе массива структур) вариант как его сделать?
Например, так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Stack 
{
    zd_vok data[100];
    int size; // количество элементов в стеке(size - 1 соответственно элемент находящийся на вершине стека)
};
 
void Add(Stack& stack, const zd_vok& d) // Добавление элементов в стек
{ 
    // ...сдесь проверка на переполнение...
    // ...
    stack.data[stack.size++] = d;
}
 
// ...
Yandex
Объявления
20.01.2013, 18:51     Статический и динамический стек
Ответ Создать тему
Опции темы

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