Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 173
1

Работа со стеком. Программа, которая к вершине стека добавляет некоторое число, а следующему элементу присваивает значение предыдущего

05.05.2013, 15:08. Просмотров 851. Ответов 11
Метки нет (Все метки)

Есть некоторый стек, в каждом элементе которого записаны по два целых числа. Нужно сделать программу которая к вершине стека добавляет некоторое число, а следующему элементу присваивает значение предыдущего.
Например в нашем стеке хранится
[2,4]>[3,6]>[5,8]>[9,10], если мы добавляем например 1 и 4, то результат должен быть
[3,8]>[2,4]>[3,6]>[5,8], то есть меняется лишь первый элемент стека, а остальные просто переписываются.
пробовал сделать сам, но проблема в том что для каждого элемента нужна новая переменная чтоб сохранить его начальное значение, т.к. в стеке нам доступен лишь один элемент...
подскажите пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2013, 15:08
Ответы с готовыми решениями:

Используя массив присвоить каждому следующему элементу сумму текущего и предыдущего элементов
Необходимо написать программу, которая используя массив присваивает каждому следующему елементу...

создать стек в памяти из этих чисел таким образом, чтобы на вершине стека было самое большое число. Удалить из стека все отрицательные элементы.
Помогите решить. В файл записывается последовательность целых чисел. Прочитать последовательность...

Побитовые операции (программа, которая интерпретирует старшие 3 бита как некоторое число n...)
Уважаемые форумчане, нужна ваша помощь. Нужно составить программу, которая интерпретирует старшие...

Работа со стеком (как достать элемент из стека?)
#include <iostream> #include <stack> int main() { std::stack<int> a; a.push(1);

11
Каратель
Эксперт С++
6593 / 4014 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
05.05.2013, 15:21 2
Цитата Сообщение от gorus95 Посмотреть сообщение
но проблема в том что для каждого элемента нужна новая переменная
ну так объясни это тому кто дал тебе задание.
если структура данных неудовлетворяет требованиям алгоритма, так нахрена её использовать?
0
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 173
05.05.2013, 15:23  [ТС] 3
Jupiter, никак нельзя сделать такое?
0
Jupiter
05.05.2013, 15:29
  #4

Не по теме:

gorus95, если идти на поводу чьей то глупости то можно все:)

2
Комп_Оратор)
Эксперт по математике/физике
8390 / 4146 / 567
Регистрация: 04.12.2011
Сообщений: 12,307
Записей в блоге: 14
05.05.2013, 16:44 5
Если стек для описанных пар, написан правильно, то доступ есть только к вершине. Поэтому можно извлечь пару из вершины и сохранить, - одна пара переменных. Затем сложить с новым значением и тут можно использовать пару входящих если они больше не нужны. Потом положить обратно старую и новую пары. Остальное извлекать и переписывать не нужно.
0
3050 / 1455 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
05.05.2013, 17:15 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
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
 
template <class FirstType, class SecondType>
struct Pair {
  typedef FirstType First;
  typedef SecondType Second;
  FirstType first;
  SecondType second;
  Pair() {}
  Pair(const FirstType &first, const SecondType &second) : first(first), second(second) {}
};
 
template <class T>
class Stack {
 public:
  Stack() : base(0), size(0) {}
  virtual ~Stack() {
    clear();
  }
  void pop() {
    Node *node = base;
    base = base->next;
    delete node;
    --size;
  }
  void push(const T &value) {
    base = new Node(base, value);
    ++size;
  }
  const T &getHead() const { return base->value; }
  void clear() {
    while (!isEmpty()) {
      pop();
    }
    size = 0;
  }  
  bool isEmpty() const { return base == 0; }
  size_t getSize() const { return size; }
 private:
  Stack(const Stack&);
  Stack &operator=(const Stack&);
  struct Node {
    Node *next;
    T value;
    Node(Node *next, const T &value) : next(next), value(value) {}
  };
  Node *base;
  size_t size;
};
 
template <class A, class B>
std::ostream &operator<<(std::ostream &stream, const Pair<A, B> pair) {
  return stream << "Pair{" <<
    "first=" << pair.first << "," <<
    "second=" << pair.second << "}";
}
 
template <class A, class B>
Pair<A, B> operator+(const Pair<A, B> &a, const Pair<A, B> &b) {
  return Pair<A, B>(a.first + b.first, a.second + b.second);
}
 
template <class T>
void removeLastItemFromStack(Stack<T> &s) {
  if (s.getSize() != 0) {
    T value = s.getHead();
    s.pop();
    if (s.getSize() != 0) {
      removeLastItemFromStack(s);
      s.push(value);
    }
  }
}
 
template <class T>
void strangePushIntoStack(Stack<T> &s, const T &value) {
  removeLastItemFromStack(s);
  s.push(s.getHead() + value);
}
 
int main(int argc, char *argv[]) {
  Stack<Pair<int, int> > s;
 
  s.push(Pair<int, int>(9, 10));
  s.push(Pair<int, int>(5, 8));
  s.push(Pair<int, int>(3, 6));
  s.push(Pair<int, int>(2, 4));
 
  strangePushIntoStack(s, Pair<int, int>(1, 4));
 
  while (!s.isEmpty()) {
    std::cout << s.getHead() << std::endl;
    s.pop();
  }
  
  return 0;
}
0
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 173
05.05.2013, 17:34  [ТС] 7
lemegeton, спасибо) но с вашим кодом мне немного трудно разобраться т.к. мы еще не дошли до template, class'ов и т.д.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Затем сложить с новым значением и тут можно использовать пару входящих если они больше не нужны.
Дело в том что добавляем мы только к первому элементу стека, а остальные просто присваиваем (переписываем из предыдущего). И поэтому они нужны, в том и проблема...
0
3050 / 1455 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
05.05.2013, 17:39 8
Цитата Сообщение от gorus95 Посмотреть сообщение
остальные просто присваиваем (переписываем из предыдущего).
По сути, переписывать ничего не надо. Это равносильно удалению последнего элемента.

Цитата Сообщение от gorus95 Посмотреть сообщение
но с вашим кодом мне немного трудно разобраться т.к. мы еще не дошли до template, class'ов
А как же вы тогда пары чисел делаете и со стеком работаете?
Возьмите тогда из моего кода только смысл -- рекурсивное удаление последнего элемента. (Можете еще сделать стеком, а не рекурсией).
1
Комп_Оратор)
Эксперт по математике/физике
8390 / 4146 / 567
Регистрация: 04.12.2011
Сообщений: 12,307
Записей в блоге: 14
05.05.2013, 18:59 9
gorus95, если это задание:
Цитата Сообщение от gorus95 Посмотреть сообщение
Есть некоторый стек, в каждом элементе которого записаны по два целых числа. Нужно сделать программу которая к вершине стека добавляет некоторое число, а следующему элементу присваивает значение предыдущего.
то остальное - Ваша интерпретация. Можно создать стек из объектов разных типов. Главное, чтобы каждый раз из одного какого-то. Если говорить о глупости, то в "идеале" можно извлечь все элементы, сделать с ними что-то и затолкать обратно. У Вас пары и требование, чтобы некая функция добавляла элемент по указанному правилу. Не путайте с самим методом push для Вашего стека. Напишите сначала функцию которая извлекает элемент и возвращает его обратно и всё поймёте. Или не поймёте. Или я ничего не понял. Вариантов море, одним словом.
0
6 / 6 / 1
Регистрация: 22.12.2012
Сообщений: 173
05.05.2013, 23:28  [ТС] 10
IGPIGP, я создал стек в котором структура из двух элементов int. Проблема в том чтобы "передвинуть" остальные элементы, при том что из стека нам доступен лишь верхний...
Так понял ничего не выйдет из этого, разве что через двусвязные списки..
0
Комп_Оратор)
Эксперт по математике/физике
8390 / 4146 / 567
Регистрация: 04.12.2011
Сообщений: 12,307
Записей в блоге: 14
05.05.2013, 23:33 11
Цитата Сообщение от gorus95 Посмотреть сообщение
Проблема в том чтобы "передвинуть" остальные элементы
Нет, проблема в том, что так как задача поставлена в начале темы, она не требует ничего "передвигать". Стек - массив фиксированной длины и в нём всё остаётся на месте, а перемещается указатель на вершину.
Похоже Вы хотите сделать не то, о чём пишете, но не говорите, что именно.
0
3050 / 1455 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
06.05.2013, 00:06 12
Мои сообщения нечитаемы?

Повторюсь.
Цитата Сообщение от gorus95 Посмотреть сообщение
Проблема в том чтобы "передвинуть" остальные элементы, при том что из стека нам доступен лишь верхний...
Не надо ничего никуда "передвигать". Поставленная задача предполагает удаление последнего элемента стека и добавление первого по особому правилу. Всё. Больше ничего не надо. Копировать что-то куда-то -- не имеет никакого смысла. Так можно и целлюлозный комбинат построить только чтобы одну попу подтирать.

Цитата Сообщение от gorus95 Посмотреть сообщение
Так понял ничего не выйдет из этого, разве что через двусвязные списки..
Удалить последний элемент стека можно рекурсивной функцией, как показано в моем коде, или используя дополнительный стек, как не показано в моем коде. Добавление элемента вообще не представляет проблем.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2013, 00:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Создать класс для работы со стеком. Элемент стека – действительное число
Создать класс для работы со стеком. Элемент стека – действительное число. Применить класс для...

Создать процедуру, которая добавляет элемент в стек или вычитает его из стека
Подскажите пожалуйста, как написать вот такую программу: На базе односвязного списка создать стек....

К каждому элементу массива прибавить некоторое число Х
Сформировать одномерный массив из n положительных чисел, вводимых с клавиатуры. К каждому элементу...

Программа реализующая действия со стеком. Формирование и вывод содержимого стека на экран дисплея
Помогите пожалуйста с программой, или приведите пример пример программы реализующей действия со...

Запишите инструкцию, которая присваивает переменной х значение -1,5
Запишите инструкцию, которая присваивает переменной х значение -1,5. Если можно полный ответ.

Преобразовать массив так, чтобы каждому элементу присваивалось значение предыдущего
1. Одномерный массив из 7 элементов заполнить случайным образом числами от 1 до 15. Преобразовать...


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

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

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