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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Balls
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
#1

Создать структуру, реализующую стек целых чисел типа LIFO - C++

31.10.2010, 11:58. Просмотров 2377. Ответов 14
Метки нет (Все метки)

Создать структуру, реализующую стек целых чисел типа LIFO. Данные структуры: массив стека, указатель на вершину стека. Создать функции: запись в вершину стека, чтение вершины стека.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2010, 11:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создать структуру, реализующую стек целых чисел типа LIFO (C++):

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

Описать класс, реализующий стек целых чисел типа LIFO. - C++
Методы класса: а) создание стека; б) добавление элемента в стек (функция push); в) выбор элемента из стека, удаляя его из стека...

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

Создать стек целых чисел на основе статического массива. - C++
Создать стек целых чисел на основе статического массива. Реализовать методы : Добавить элемент, удалить элемент, вершина стека. На...

Создать стек из случайных целых чисел и отсортировать элементы по возрастанию (убыванию) - C++
Здраствуйте!Можете помочь с заданием???Дана программа: #include <iostream> #include <malloc.h> using namespace std; /* run this...

Создать шаблон класса типа стек - C++
Помогите, пожалуйста. Необходимо создать шаблон класса типа стек. Я никак не пойму, как перегружать операторы, если у меня шаблон класса...

14
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
31.10.2010, 13:15 #2
И в чём проблема?
0
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
31.10.2010, 13:44 #3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define N 1000  // Размер стека
struct {
   int L; // Заполненность стека
   int *p;
   int M[N];
} Stac = { 0 };
Push(int k) // Положить в стек
{
  if (Stac.L >= Stac.N-1) return;  // Стек переполнен
  Stac.M[L] = k;
  Stac.p = Stac.M+Stac.L;
  Stac.L++;
}
int Pop() // Чтение вершины
{
  if (Stac.L=0) return 0;  // Стек пуст
  Stac.L--;
  return Stac.p--;
}
0
Balls
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
31.10.2010, 14:13  [ТС] #4
Цитата Сообщение от volovzi Посмотреть сообщение
И в чём проблема?
Не могу реализовать чтение вершины и запись в вершину стэка. Программу к сожалению не могу показать у меня нету ее
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
31.10.2010, 14:50 #5
У тебя в задании уже практически расписано решение. Напиши свой вариант, и посмотрим, что можно будет исправить.
Программой тов. Day не пользуйся, там ошибки.
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.11.2010, 07:10 #6
C
1
2
3
4
5
6
int Pop() // Чтение вершины
{
  if (Stac.L=0) return 0;  // Стек пуст
  Stac.L--;
  return Stac.p--;
}
если бы здесь был правильный код, то в стек нельзя бы было положить ноль
0
Balls
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
01.11.2010, 10:20  [ТС] #7
вот у меня какая прога получилась
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
#include<iostream.h>
struct Stack
{
       int V[10];
       int *Ptr;
       };
void vvod (Stack &);
void chtenie (Stack &);
void init (Stack &);
main()
{
      Stack S; int i;
      init (S);
      for (i=0; i<10; i++)
      vvod (S);
      chtenie (S);
      system ("Pause");
      return 0;
}
void init (Stack&strc)
{
     strc.Ptr=&(strc.V[0]);
}
void vvod (Stack&strc)
{
     cout<<"Input Stack Elements"<<endl;
     cin>>strc.V[0];
     strc.Ptr=strc.Ptr+1;
}
void chtenie (Stack&strc)
{
     cout<<"Stack Elements "<<strc.V[0]<<endl;
     strc.Ptr=strc.Ptr-1;
}
0
KpeHDeJIb
56 / 56 / 3
Регистрация: 31.10.2010
Сообщений: 103
01.11.2010, 11:57 #8
Пожалуй самый простой вариант с динамически выделяемой памятью будет таким:
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
#include <iostream>
 
struct Stack
{
public:
    Stack(): m_items(NULL), m_count(0)
    {
    }
 
    ~Stack()
    {
        delete[] m_items;
    }
 
    void push(int value)
    {
        int *temp = new int[m_count + 1];
 
        for (unsigned i = 0; i < m_count; ++i)
            temp[i] = m_items[i];
 
        temp[m_count] = value;
 
        delete[] m_items;
        m_items = temp;
 
        ++m_count;
    }
 
    int pop()
    {
        int value, *temp = NULL;
 
        if (m_count == 0)
        {
            return 0;
        }
 
        --m_count;
 
        value = m_items[0];
 
        if (m_count != 0)
        {
            temp = new int[m_count];
 
            for (unsigned i = 0; i < m_count; ++i)
                temp[i] = m_items[i];
 
            value = m_items[m_count];
        }
 
        delete[] m_items;
        m_items = temp;
 
        return value;
    }
 
    unsigned size() const
    {
        return m_count;
    }
 
private:
    int      *m_items;
    unsigned m_count;
};
 
int main()
{
    Stack stack;
 
    for (unsigned i = 0; i < 100; ++i)
        stack.push(i);
 
    while (stack.size())
        std::cout << stack.pop() << std::endl;
 
    return 0;
}
0
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
01.11.2010, 12:57 #9
Цитата Сообщение от accept Посмотреть сообщение
C
1
2
3
4
5
6
int Pop() // Чтение вершины
{
  if (Stac.L=0) return 0;  // Стек пуст
  Stac.L--;
  return Stac.p--;
}
если бы здесь был правильный код, то в стек нельзя бы было положить ноль
Согласен.
Просто не хотел усложнять код введением еще одной переменной для ошибки.
Так что мой код можно рассматривать, как набросок.
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
01.11.2010, 17:47 #10
Balls, нормально, только инициализацию и функции записи и чтения надо сделать методами класса, а ещё добавить метод-проверку на пустоту стека.
Вариант Кренделя ничего, но не соответствует (насколько я понял) заданию, и в нём неэффективная работа с памятью.
Вообще, на плюсах создание такого класса смысла не имеет, потому что есть std::stack. Было бы лучше писать на Си. Но раз уж такое задание, то предлагаю следующий вариант:
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
#include <iostream>
 
#define SIZE 10
 
class stack {
public:
    stack () : top(0) {}
    
    void push (int number) {
        if (is_empty()) top = items;
        else ++top;
        
        *top = number;
    }
    
    int pop () {
        int result = *top;
        
        if (top == items) top = 0;
        else --top;
        
        return result;
    }
    
    void clear () { top = 0; }
    
    bool is_empty () const { return top == 0; }
    bool is_full () const { return !is_empty() && (top >= items + SIZE - 1); }
 
private:
    int items[SIZE];
    int * top;
};
 
int main (int argc, char * const argv[]) {
    stack s;
    
    for (int i = 0; !s.is_full(); ++i) s.push(i);
    
    while (!s.is_empty()) std::cout << s.pop() << " ";
 
    return 0;
}
0
KpeHDeJIb
56 / 56 / 3
Регистрация: 31.10.2010
Сообщений: 103
01.11.2010, 18:42 #11
Цитата Сообщение от volovzi Посмотреть сообщение
Вариант Кренделя ничего, но не соответствует (насколько я понял) заданию, и в нём неэффективная работа с памятью.
Ну должно же быть похоже на работу студента

На Си можно по быстрому что-то в таком духе зарядить, не расширяемый стек:
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
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
typedef int item_t;
 
typedef struct {
    unsigned reserved, size;
    item_t   items[];
} stack_t;
 
stack_t *stack_create(unsigned reserved)
{
    stack_t *stack  = malloc(sizeof(stack_t) + reserved * sizeof(item_t));
    stack->reserved = reserved;
    stack->size     = 0;
 
    return stack;
}
 
void stack_destroy(stack_t *stack)
{
    free(stack);
}
 
void stack_push(stack_t *stack, int value)
{
    assert(stack);
    assert(stack->size < stack->reserved);
 
    stack->items[stack->size++] = value;
}
 
item_t stack_pop(stack_t *stack)
{
    assert(stack);
    assert(stack->size);
 
    return stack->items[--stack->size];
}
 
int main()
{
    unsigned i, n = 10;
    stack_t *stack = stack_create(n);
 
    for (i = 0; i < n; ++i)
        stack_push(stack, i);
 
    while (stack->size)
        printf("stack top: %d\n", stack_pop(stack));
 
    stack_destroy(stack);
 
    return 0;
}
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
01.11.2010, 19:01 #12
KpeHDeJIb, ага, типтого. Только у них в задании написано про работу с указателем на вершину стека. Мне кажется, это ключевой момент.
0
Balls
0 / 0 / 0
Регистрация: 15.04.2010
Сообщений: 12
01.11.2010, 22:29  [ТС] #13
Блин это ваще лаба по программированию) Я просто не шарю в С++ вобще)
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
01.11.2010, 22:48 #14
Balls, это ты к чему? Тебе уже дали кучу подсказок и даже несколько рабочих вариантов. Бери, разбирайся и начинай шарить .
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.11.2010, 02:00 #15
Цитата Сообщение от Day Посмотреть сообщение
Согласен.
Просто не хотел усложнять код введением еще одной переменной для ошибки.
Так что мой код можно рассматривать, как набросок.
если туда положить 1000 элементов, а в середине будет ноль
то при чтении стека, будет прочитано только полстека
0
02.11.2010, 02:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2010, 02:00
Привет! Вот еще темы с ответами:

Как создать стек объектов произвольного типа? - C++
Предметная область: «Стек объектов произвольного типа». Данные класса: динамический список элементов стека. Функции класса: считывание...

Реализовать пользовательские классы - дек, стек (LIFO), очередь (FIFO) на базе класса list библиотеки STL - C++
Создать пользовательские классы - дек, стек (LIFO), очередь (FIFO) на базе класса list библиотеки STL. Написать тестирующую программу,...

Стек для хранения целых чисел (int) - C++
Стек для хранения целых чисел (int). В классе должны быть функции добавления элемента на вершину стека (push), чтение верхнего элемента...

Организуйте стек для хранения целых чисел - C++
Организуйте стек для хранения целых чисел. Для стека используйте массив unsigned short. Продемонстрируйте добавление элемента,...


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

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

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