Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/47: Рейтинг темы: голосов - 47, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8

Как правильно написать функцию push (положить в стек)

22.07.2014, 18:28. Показов 9164. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, господа. Не могу сообразить, как правильно написать функцию push (положить в стек). Ткните меня носом пожалуйста. Всё остальное без ошибок.
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
#include <conio.h>
#include <iostream.h>
struct Node
  {
  int left;
  Node *next;
  };
Node *beg = 0;
void push(Node *beg, const int inf)
  {
  Node *pv = new Node;
  pv->left = inf;
  pv->next = beg;
  beg = pv;
  }
void pop(Node *beg, int &inf)
  {
  cout << beg->left << " ";
  inf = beg->left;
  if(beg->next==0)
    return;
  *beg = *beg->next;
  }
int  main()
  {
  int inf;
  for(int i=0; i<10; i++)
    {
    push(beg,i);
        cout << " " << i << " ";
    }
  cout << endl;
  for(int i=0; i<10; i++)
    {
    pop(beg,inf);
        cout << " " << inf << " ";
    }
  getch();
  return 0;
  }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.07.2014, 18:28
Ответы с готовыми решениями:

не могу разобраться как написать функцию сортировки и исправить функцию добавления в стек
#include &lt;iostream&gt; #include&lt;Windows.h&gt; using namespace std; struct NE{ int x; NE *pnext,*ppor,*cur;}; class SPISOK { NE...

Как правильно написать функцию?
Привет :) Начал изучение функций в С++. Написал первую, и тут же начались проблемы. Вот код. Помогите пожалуйста #include...

Как правильно написать функцию?
Необходимо написать функцию кот вычисляет интервал времени: void DigitalTime::interval_since(const DigitalTime&amp; a_previous_time,...

10
Модератор
Эксперт С++
 Аватар для zss
13772 / 10965 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
22.07.2014, 19:04
По моему push написана правильно, а вот pop
C++
1
2
3
4
5
6
7
8
9
void pop(Node *beg, int &inf)
  {
      cout << beg->left << " ";
      inf = beg->left;
      Node* tmp;
      tmp=beg->next;
      delete beg;
      beg = tmp;
  }
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
22.07.2014, 19:21
А по-моему и в push-е чушь. Вообще непонятная реализация.
14-я строка вызывает у меня кучу сомнений.
1
Модератор
Эксперт С++
 Аватар для zss
13772 / 10965 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
22.07.2014, 19:26
Цитата Сообщение от castaway Посмотреть сообщение
А по-моему и в push-е чушь
C++
1
2
3
4
5
6
7
void push(Node *beg, const int inf)
  {
  Node *pv = new Node; // создали новый элемент
  pv->left = inf;  // записали в него значение
  pv->next = beg; // предыдущее начало записали как следующее
  beg = pv; // поставили созданный элемент в начало
  }
Вроде правильно.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
22.07.2014, 19:40
beg - локальная переменная. Мы её меняем и что должно произойти дальше?

Добавлено через 4 минуты
Тут наверное поможет ссылка на указатель.
1
Модератор
Эксперт С++
 Аватар для zss
13772 / 10965 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
22.07.2014, 19:49
Цитата Сообщение от castaway Посмотреть сообщение
beg - локальная переменная
Она совсем и не локальная, а 1. Параметр функции
и 2. (не понятно зачем) глобальная.
1
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
22.07.2014, 20:23  [ТС]
Ура! Получилось! Я тут часть кода снёс и всё заработало.
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 <conio.h>
#include <iostream.h>
struct Node
  {
  int left;
  Node *next;
  };
Node *beg = 0;
void push(const int inf)
  {
  Node *pv = new Node;
  pv->left = inf;
  pv->next = beg;
  beg = pv;
  }
void pop(int &inf)
  {
  inf = beg->left;
  beg = beg->next;
  }
int main()
  {
  int inf;
  for(int i=0; i<10; i++)
    {
    push(i);
    cout << " " << i << " ";
    }
  cout << endl;
  for(int i=0; i<10; i++)
    {
    pop(inf);
    cout << " " << inf << " ";
    }
  getch();
  return 0;
  }
Добавлено через 5 минут
Спасибо всем! А в функции push нельзя обойтись одной переменной (только beg, без pv)?
0
Модератор
Эксперт С++
 Аватар для zss
13772 / 10965 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
22.07.2014, 21:13
Цитата Сообщение от Критинище Посмотреть сообщение
без pv
А что Вы тогда собираетесь запихивать?
Вот beg из параметров выкинута разумна - она у Вас глобальная.
Хотя лучше избегать глобальные переменные.

И еще раз напоминаю при таком pop идет утечка памяти!!!!
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
23.07.2014, 07:13
Параметр функции - это локальная переменная/константа внутри функции.

Добавлено через 4 минуты
Критинище, срздай конструктор с двумя параметрами для Node, тогда push сможет выглядеть так:
C++
1
2
3
void push( const int f ) {
    beg = new Node( inf, beg );
}
1
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 8
23.07.2014, 20:03  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
срздай конструктор с двумя параметрами для Node, тогда push сможет выглядеть так:
Получилось! Спасибо! И последний вопрос: В классе больше ничего нельзя оптимизировать?
Память в pop не очищаю для того, чтобы извлекать элементы повторно.
C++ (Qt)
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
#include <conio.h>
#include <iostream.h>
class Node
  {
  Node *beg;  // сделал локальной
  public:
    int left;
    Node *next;
    Node(int f, Node *n)  // добавил конструктор
      {
      left = f;
      next = n;
      }
    void push(const int inf)
      {
      beg = new Node(inf,beg);
      }
    void pop(int &inf)
      {
      inf = beg->left;  
      beg = beg->next;
      }
  };
int main()
  {
  Node st(0,0);  //  вот так объявил
  int inf;
  for(int i=0; i<10; i++) 
    st.push(i);
  cout << endl;
  for(int i=0; i<10; i++)
    st.pop(inf);
  getch();
  return 0;
  }
P.S.: Поставил себе задачу сделать двунаправленный список с разными интересными методами. Плясать буду от этого стека. Поэтому, мне очень важно чтобы он был грамотно составлен.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.07.2014, 08:07
Лучший ответ Сообщение было отмечено Критинище как решение

Решение

У тебя каждый элемент стека хранит указатель на начало. Это лишнее.
Создай два класса: stack и node. В stack будешь хранить указатель beg, в нём же будут методы push и pop, а в классе node только данные и указатель на следующий элемент, ну и конструктор.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2014, 08:07
Помогаю со студенческими работами здесь

Как правильно написать шаблонную функцию?
Как правильно написать функцию template ? в функции main не работает #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using...

АТД Стек. Различие между push() и emplace()
Здравствуйте! Расталкуйте пожалуйста в чем заключается различие между двумя методами стека push() и emplace(). на первый взгляд и...

Написать шаблонную функцию, сортирующую стек
Как мне сделать чтобы я мог вводить значения любого типа? Писал что то типа: template&lt;typename stack&gt; но эт не верно. С шаблонами...

Написать функцию добавления элемента в динамический стек
Что-то до меня не доходит... #include &lt;conio.h&gt; #include &lt;iostream&gt; struct dstack { dstack *down; int...

Написать программу, реализующую стек на базе односторонне связного списка и стандартные операции push, pop
Написать программу, реализующую стек на базе односторонне связного списка и стандартные операции со стеком на примере функций: ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru