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

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

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

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

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

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

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

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

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

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

Контейнер, наследование и разные типы данных - C++
День добрый. Вопрос собственно не один а три. Но основной один. Как удрать if'ы на участре кода №1. Так же приму советы по...

Vector, хранящий разные структуры - C++
Решил на C++ написать программу, которая может в 1 массиве (векторе) хранить разные структуры. Допусти есть несколько структур: Men ...

6
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
26.03.2016, 02:45 #2
Ну тут есть два популярных варианта: Либо union, либо void*. "Если вообще любой", то void*. Но вообще зря вы это затеяли. Не надо так делать.
1
ChadloveMary
2 / 5 / 1
Регистрация: 13.09.2015
Сообщений: 99
26.03.2016, 03:38  [ТС] #3
lemegeton, можно, пожалуйста, поподробнее.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
hoggy
6653 / 2841 / 486
Регистрация: 15.11.2014
Сообщений: 6,286
Завершенные тесты: 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;
    }
}
суть в том, что это - самый обычный стек,
просто в качестве его элементов выступает тип,
который может принимать объекты
любого другого типа.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
26.03.2016, 13:25 #6
Цитата Сообщение от ChadloveMary Посмотреть сообщение
стек нужно реализовать на основе односвязного/двусвязного списка
А вы ему boost предлагаете. )
0
hoggy
6653 / 2841 / 486
Регистрация: 15.11.2014
Сообщений: 6,286
Завершенные тесты: 1
26.03.2016, 13:43 #7
Цитата Сообщение от lemegeton Посмотреть сообщение
А вы ему boost предлагаете. )
я ничего не предлагал.
лишь проиллюстрировал идею: "как это работает".

если есть такая потребность:
ничего не мешает завелосипедить stack/any с нуля.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2016, 13:43
Привет! Вот еще темы с ответами:

Реализовать простейшую базу данных, используя пользовательские типы (структуры) - C++
Помогите написать простую программу с помощью структур

Реализовать структуру данных стек, содержащую следующие методы: - C++
Реализовать структуру данных стек, содержащую следующие методы: добавить элемент в стек, удалить элемент из стека, получить значение с...

Реализовать классы для структур данных «стек» и «очередь» - C++
дали такое задание, не понимаю что делать.. Реализовать классы для структур данных «стек» и «очередь». Следует реализовать...

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си? - C++
Добрый вечер! Был бы очень признателен, если бы Вы помогли бы мне понять нижеследующие вопросы: 1. Можете ли на понятным для...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
26.03.2016, 13:43
Ответ Создать тему
Опции темы

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