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

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

Войти
Регистрация
Восстановить пароль
 
ChadloveMary
2 / 5 / 1
Регистрация: 13.09.2015
Сообщений: 86
#1

Как реализовать стек, хранящий разные типы данных одновременно? - C++

26.03.2016, 02:37. Просмотров 287. Ответов 6

стек нужно реализовать на основе односвязного/двусвязного списка. Я так понял, что у нас должен быть класс являющийся узлом стека, и уже второй класс будет являться собственно стеком, но как реализовать поддержку разных типов данных элементов одновременно? то есть у нас стек может выглядеть допустим так:
1 элемент = 25
2 элемент = "afefearg"
...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2016, 02:37     Как реализовать стек, хранящий разные типы данных одновременно?
Посмотрите здесь:

Реализовать список, поля которого могут хранить разные типы данных C++
абстрактные типы данных "СТЕК" и "ОЧЕРЕДЬ" C++
Реализовать простейшую базу данных, используя пользовательские типы (структуры) C++
Реализовать классы для структур данных «стек» и «очередь» C++
C++ Реализовать структуру данных стек, содержащую следующие методы:
Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си? C++
C++ Реализовать класс стек, хранящий в себе строки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2914 / 1343 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.03.2016, 02:45     Как реализовать стек, хранящий разные типы данных одновременно? #2
Ну тут есть два популярных варианта: Либо union, либо void*. "Если вообще любой", то void*. Но вообще зря вы это затеяли. Не надо так делать.
ChadloveMary
2 / 5 / 1
Регистрация: 13.09.2015
Сообщений: 86
26.03.2016, 03:38  [ТС]     Как реализовать стек, хранящий разные типы данных одновременно? #3
lemegeton, можно, пожалуйста, поподробнее.
lemegeton
 Аватар для lemegeton
2914 / 1343 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.03.2016, 11:27     Как реализовать стек, хранящий разные типы данных одновременно? #4
Цитата Сообщение от ChadloveMary Посмотреть сообщение
lemegeton, можно, пожалуйста, поподробнее.
Я так понимаю, что вам нужен просто код, который реализует некий стек. Не обязательно ходить вокруг да около. Это выглядит нелепо. Честнее просто попросить. Да, иногда бывает вместо ответа язвительный комментарий, но в подавляющем большинстве случаев вы получите свой код.

Выкладывайте, пожалуйста, задание. Крайне маловероятно, что вам дали задание сделать стек, который одновременно работает с разными типами. Скорее всего, вам нужно просто сделать шаблон стека.

Ну вот вам стек чего угодно. В комментарии нормальная работа с таким стеком, после комментария -- как вы просите -- с разными типами данных в одном флаконе.

Написан на коленке, без контроля ошибок, конструктора копирования, оператора присваивания и т.д. и т.п. Зато сразу с итератором.
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
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <iostream>
 
template<class T>
class Stack {
 private:
  struct Node {
    T data;
    Node *prev;  
    Node(const T &data, Node *prev) : data(data), prev(prev) {}
  };
 
  int size;
  Node *head;
 public:
  class Iterator {
   public:
    Iterator(Node *node) : node(node) {}
    Iterator &operator++(int) {
      node = node->prev;
      return *this;
    }
    Iterator operator++() {
      Iterator result = Iterator(node);
      node = node->prev;
      return result;
    }
    const T &operator*() {
      return node->data;
    }
    bool operator!=(const Iterator &o) {
      return node != o.node;
    }
   private:
    Node *node;
  };
 
  Stack() : size(0), head(0) {}
  ~Stack() {
    clear();
  }
  const T &peek() const {
    return head.data;
  }
  T pop() {
    T data = head->data;
    Node *first = head;
    head = first->prev;
    delete first;
    size--;
    return data;
  }
  void push(const T &data) {
    size++;
    head = new Node(data, head);
  }
  int getSize() const {
    return size;
  }
  void clear() {
    while (size > 0) {
      pop();
    }
  }
  Iterator begin() {
    return Iterator(head);
  }
  Iterator end() {
    return Iterator(0);
  }
};
 
int main(int, char**) {
/*
  // так правильно
  Stack<int> stack;
  stack.push(1);
  stack.push(2);
  stack.push(3);
  std::cout << "Size: " << stack.getSize() << std::endl;
 
  for (Stack<int>::Iterator i = stack.begin(); i != stack.end(); ++i) {
    std::cout << *i << std::endl;
  }
  while (stack.getSize() > 0) {
    std::cout << stack.pop() << std::endl;
  }
*/
  // так неправильно
  Stack<void*> voidStack;
 
  voidStack.push(new std::string("text"));
  voidStack.push(new int(9));
 
  int *x = (int*)voidStack.pop();
  std::cout << *x << std::endl;
  delete x;
 
  std::string *y = (std::string*)voidStack.pop();
  std::cout << *y << std::endl;
  delete y;
 
  return 0;
}
Так, конечно, делать не надо. Работать с этим -- сущий ад.
hoggy
5715 / 2306 / 417
Регистрация: 15.11.2014
Сообщений: 5,149
Завершенные тесты: 1
26.03.2016, 13:14     Как реализовать стек, хранящий разные типы данных одновременно? #5
Цитата Сообщение от ChadloveMary Посмотреть сообщение
стек нужно реализовать на основе односвязного/двусвязного списка. Я так понял, что у нас должен быть класс являющийся узлом стека, и уже второй класс будет являться собственно стеком, но как реализовать поддержку разных типов данных элементов одновременно? то есть у нас стек может выглядеть допустим так:
1 элемент = 25
2 элемент = "afefearg"
...

как то так:
http://rextester.com/JFH17939
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
#include <boost/any.hpp>
#include <iostream>
#include <stack>
 
 
using stack = std::stack<boost::any>;
 
void view(const stack&);
 
int main()
{
    std::cout << "Hello, world!\n";
    
    stack mystack;
    
    mystack.emplace(10);
    mystack.emplace( std::string( "afefearg") );
    
    view(mystack);
}
 
void view(const stack& src)
{
    stack s = src;
    while(!s.empty())
    {
        const auto el = s.top();
        s.pop();
        
        if( el.type() == typeid(int) )
            std::cout << boost::any_cast<int>(el) 
                << std::endl;
        else if (el.type() == typeid(std::string))
            std::cout << boost::any_cast<std::string>(el) 
                << std::endl;
    }
}
суть в том, что это - самый обычный стек,
просто в качестве его элементов выступает тип,
который может принимать объекты
любого другого типа.
lemegeton
 Аватар для lemegeton
2914 / 1343 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.03.2016, 13:25     Как реализовать стек, хранящий разные типы данных одновременно? #6
Цитата Сообщение от ChadloveMary Посмотреть сообщение
стек нужно реализовать на основе односвязного/двусвязного списка
А вы ему boost предлагаете. )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2016, 13:43     Как реализовать стек, хранящий разные типы данных одновременно?
Еще ссылки по теме:

C++ Как реализовать ввод и чисел и символов одновременно?
Два и больше действия одновременно, как реализовать? C++
Контейнер, наследование и разные типы данных C++
Размер указателя на разные типы данных C++
C++ Vector, хранящий разные структуры

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

Или воспользуйтесь поиском по форуму:
hoggy
5715 / 2306 / 417
Регистрация: 15.11.2014
Сообщений: 5,149
Завершенные тесты: 1
26.03.2016, 13:43     Как реализовать стек, хранящий разные типы данных одновременно? #7
Цитата Сообщение от lemegeton Посмотреть сообщение
А вы ему boost предлагаете. )
я ничего не предлагал.
лишь проиллюстрировал идею: "как это работает".

если есть такая потребность:
ничего не мешает завелосипедить stack/any с нуля.
Yandex
Объявления
26.03.2016, 13:43     Как реализовать стек, хранящий разные типы данных одновременно?
Ответ Создать тему
Опции темы

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