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

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

Войти
Регистрация
Восстановить пароль
 
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 151
Завершенные тесты: 1
#1

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

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

Есть некоторый стек, в каждом элементе которого записаны по два целых числа. Нужно сделать программу которая к вершине стека добавляет некоторое число, а следующему элементу присваивает значение предыдущего.
Например в нашем стеке хранится
[2,4]>[3,6]>[5,8]>[9,10], если мы добавляем например 1 и 4, то результат должен быть
[3,8]>[2,4]>[3,6]>[5,8], то есть меняется лишь первый элемент стека, а остальные просто переписываются.
пробовал сделать сам, но проблема в том что для каждого элемента нужна новая переменная чтоб сохранить его начальное значение, т.к. в стеке нам доступен лишь один элемент...
подскажите пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2013, 15:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа со стеком. Программа, которая к вершине стека добавляет некоторое число, а следующему элементу присваивает значение предыдущего (C++):

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

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

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

Создать класс для работы со стеком. Элемент стека – действительное число - C++
Создать класс для работы со стеком. Элемент стека – действительное число. Применить класс для вывода возрастающих серий последовательности...

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

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

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

Не по теме:

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

2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,645
Записей в блоге: 5
05.05.2013, 16:44 #5
Если стек для описанных пар, написан правильно, то доступ есть только к вершине. Поэтому можно извлечь пару из вершины и сохранить, - одна пара переменных. Затем сложить с новым значением и тут можно использовать пару входящих если они больше не нужны. Потом положить обратно старую и новую пары. Остальное извлекать и переписывать не нужно.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 151
Завершенные тесты: 1
05.05.2013, 17:34  [ТС] #7
lemegeton, спасибо) но с вашим кодом мне немного трудно разобраться т.к. мы еще не дошли до template, class'ов и т.д.

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

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

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

Цитата Сообщение от gorus95 Посмотреть сообщение
Так понял ничего не выйдет из этого, разве что через двусвязные списки..
Удалить последний элемент стека можно рекурсивной функцией, как показано в моем коде, или используя дополнительный стек, как не показано в моем коде. Добавление элемента вообще не представляет проблем.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 00:06
Привет! Вот еще темы с ответами:

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

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

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

Написать инструкцию, которая присваивает целой переменной случайное число - C++
Генератор случайных чисел. Написать инструкцию, которая присваивает целой переменной случайное число в интервале от -10 до +10.


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
06.05.2013, 00:06
Ответ Создать тему
Опции темы

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