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

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

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

Реализовать список, поля которого могут хранить разные типы данных C++
Реализовать классы для структур данных «стек» и «очередь» C++
C++ Реализовать структуру данных стек, содержащую следующие методы:
C++ Реализовать класс стек, хранящий в себе строки
Два и больше действия одновременно, как реализовать? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.03.2016, 02:45     Как реализовать стек, хранящий разные типы данных одновременно? #2
Ну тут есть два популярных варианта: Либо union, либо void*. "Если вообще любой", то void*. Но вообще зря вы это затеяли. Не надо так делать.
ChadloveMary
0 / 3 / 1
Регистрация: 13.09.2015
Сообщений: 82
26.03.2016, 03:38  [ТС]     Как реализовать стек, хранящий разные типы данных одновременно? #3
lemegeton, можно, пожалуйста, поподробнее.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 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
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 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
2910 / 1339 / 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++ Vector, хранящий разные структуры

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

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

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

Метки
стек
Опции темы

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