2 / 5 / 1
Регистрация: 13.09.2015
Сообщений: 100
1

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

26.03.2016, 02:37. Показов 5099. Ответов 6

стек нужно реализовать на основе односвязного/двусвязного списка. Я так понял, что у нас должен быть класс являющийся узлом стека, и уже второй класс будет являться собственно стеком, но как реализовать поддержку разных типов данных элементов одновременно? то есть у нас стек может выглядеть допустим так:
1 элемент = 25
2 элемент = "afefearg"
...
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2016, 02:37
Ответы с готовыми решениями:

LINQ запрос в List<object> хранящий разные типы
Собственно, есть два класса, экземпляры которых хранятся в одном общем контейнере как object.Задача...

Реализовать класс стек, хранящий в себе строки
Необходимо реализовать класс стек, хранящий в себе строки. Чужие реализации не интересуют. Шаблоны...

Реализовать список, поля которого могут хранить разные типы данных
Помогите,пожалуйста с задачей. Реализовать список,информационные поля которого могут хранить...

реализовать без применения STL, абстрактные типы данных (по одной программе для каждого из типов) список, стек
Задача: реализовать без применения STL, абстрактные типы данных (по одной программе для каждого из...

6
3380 / 1587 / 553
Регистрация: 29.11.2010
Сообщений: 3,265
26.03.2016, 02:45 2
Ну тут есть два популярных варианта: Либо union, либо void*. "Если вообще любой", то void*. Но вообще зря вы это затеяли. Не надо так делать.
1
2 / 5 / 1
Регистрация: 13.09.2015
Сообщений: 100
26.03.2016, 03:38  [ТС] 3
lemegeton, можно, пожалуйста, поподробнее.
0
3380 / 1587 / 553
Регистрация: 29.11.2010
Сообщений: 3,265
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;
}
Так, конечно, делать не надо. Работать с этим -- сущий ад.
0
Эксперт С++
8560 / 4134 / 910
Регистрация: 15.11.2014
Сообщений: 9,334
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;
    }
}
суть в том, что это - самый обычный стек,
просто в качестве его элементов выступает тип,
который может принимать объекты
любого другого типа.
0
3380 / 1587 / 553
Регистрация: 29.11.2010
Сообщений: 3,265
26.03.2016, 13:25 6
Цитата Сообщение от ChadloveMary Посмотреть сообщение
стек нужно реализовать на основе односвязного/двусвязного списка
А вы ему boost предлагаете. )
0
Эксперт С++
8560 / 4134 / 910
Регистрация: 15.11.2014
Сообщений: 9,334
26.03.2016, 13:43 7
Цитата Сообщение от lemegeton Посмотреть сообщение
А вы ему boost предлагаете. )
я ничего не предлагал.
лишь проиллюстрировал идею: "как это работает".

если есть такая потребность:
ничего не мешает завелосипедить stack/any с нуля.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2016, 13:43

Как не писать один и тот же код, для функции, принимающей разные типы данных в качестве аргумента
Проблема такая: есть некая функция. Внутри нее происходят одни и теже вычисления, вне зависимости...

Разные типы данных
Нужно выполнить простое вычитание одного слагаемого из другого. Проблема в том, что первое задано...

Абстрактные типы данных: список, стек, очередь
Всем привет прошу помощи, задали задания, но я вообще не понимаю каким образом это решать (т.к...

Размер указателя на разные типы данных
еще один вопрос к етой теме почуму придавая указателю * prt тип short int или double функция sizeof...


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

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

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