Тема: Стек, перевірка на наявність елементів

Допоможіть мені розібратися із програму, в функції Perevirka перевіряє чи є елементи в стеку якщо немає то створює перший елемент стеку, але там стоїть яво неправильне порівняння

 if ((*Begin)->data == -1)

  я не знаю як перевірити чи є елементи в стеку.І ще одна проблема я невпевнений що моя програма дійсно стек і взагалі яка є різниця між стеком і лінійним списком поясніть.

#include <iostream>
#include <conio.h>

using namespace std;

struct MyStruct
{
    int data;
    MyStruct *next;
    MyStruct();
};

MyStruct::MyStruct()
{
    data = -1;
}

void Print(MyStruct *One)
{
    MyStruct *Prin = One;
    do
    {
        cout << Prin->data << " ";
    } while (Prin = Prin->next);
}

bool Perevirka(MyStruct **Begin,int i)
{
    if ((*Begin)->data == -1)
    {
        (*Begin)->data = i;
        (*Begin)->next = NULL;
        return false;
    }
    else
        return true;
}

void App(MyStruct **Begin,int i)
{
    if (false==Perevirka(Begin, i))
        return;
    MyStruct *El = new MyStruct;
    El->data = i;
    El->next = NULL;
    (*Begin)->next = El;
    (*Begin) = El;
}

int main()
{
    MyStruct *Begin;
    Begin = new MyStruct;
    MyStruct *One = Begin;
    for (int i = 0; i <= 100; i += 10)
        App(&Begin, i);
    Print(One);
    getch();
    return 0;
}

2

Re: Стек, перевірка на наявність елементів

Перевірити як варіант отак

bool is_exist(MyStruct* src, int i)
{
    while (src)
    {
        if (src->data == i)
        {
            return true;
        }
        src = src->next;
    }
    return false;
}

Але я радив би вам це все видалити і переписати.
Це Однозв’язний список
Стек то інаше (хоча на основі списку можна й стек зробити, але не вникайте в це моє твердження)

Подякували: Betterthanyou1

3

Re: Стек, перевірка на наявність елементів

Стек - це область пам’яті із послідовним доступом за принципом Last In First Out (LIFO).
Стек порівнюють із магазином до автомату (пам’ять) і патронами (дані). Ви можете записати в пам’ять певні дані (зарядити патрон в магазин), а потім зробити це іще раз, але щоб отримати доступ до даних які ви записали перший раз, вам обов’язково треба "витягнути" дані, які ви записали потім.
Детальніше тут.

По вашому коду: зазвичай для роботи зі стеком використовують функції push() - записує в наступну вільну позицію стеку та pop() - отримує верхній елемент. Але стек можна організувати вручну. Розкажіть детальніше про цей код і ваше завдання: звідки він і що треба зробити?

4

Re: Стек, перевірка на наявність елементів

0x9111A Ви неправильно зрозуміли

(*Begin)->data == -1

я порівнюю корисну інформацію стеку тобто data із -1 тому що я не знаю як перевірити стек на NULL тобто пустоту, того я і зробив це порівняння але в подальшому потрібно в data записувати будь-яку інформацію і коли туди запишеться -1 буде помилка

5 Востаннє редагувалося Betterthanyou (25.09.2014 21:21:23)

Re: Стек, перевірка на наявність елементів

Ярослав написав:

Розкажіть детальніше про цей код і ваше завдання: звідки він і що треба зробити?

Цей код я написав сам я тільки вивчаю напів динамічні і динамічні структури даних, мені потрібно зробити стек і чергу і реалізувати функції які відповідають за додавання, видалення, перевірку на пустоту стеку і черги

6 Востаннє редагувалося Betterthanyou (25.09.2014 21:22:38)

Re: Стек, перевірка на наявність елементів

Якщо ви знає посібники де написано про стек і чергу на Українській мові, будь-ласк скачіть назву книги

7

Re: Стек, перевірка на наявність елементів

Я б всетаки радив вам перглянути погляд на завдання й переписати все. Цілком імовірно що тоді такої проблеми не виникне.
Оскільки у вас однозв’язний список а не стек ви (для швидкого додавння нового елементу) окремо тримаєте вказівник на початок і на кінець, що краще інкапсулювати (тримати в якійсь структурі що й буде списком а для вузла зробити окрему структуру). Спробуйте, побачите як зручно.

Бонус

Паскудний код для роботи з вашим паскудним (перепишіть!) списком як зі стеком

void push(MyStruct* src, int i)
{
    while (src->next) { src = src->next; };
    src->next = new MyStruct;
    src->next->data = i;
    src->next->next = NULL;
}

int pop(MyStruct* src)
{
    while (src->next->next) { src = src->next; };
    int res = src->next->data;
    delete src->next;
    return res;
}
Подякували: Betterthanyou1

8

Re: Стек, перевірка на наявність елементів

да судячи по вашому коді, ви ненавчились чи недочитали до коментарів
а раджу прочитати

9

Re: Стек, перевірка на наявність елементів

Якщо ви знає посібники де написано про стек і чергу на Українській мові,

УкрВікі

10

Re: Стек, перевірка на наявність елементів

стек краще зрозуміти коли глянути код в асемблері push, pop
зараз ви запутаєтесь про різні виклики С чи паскаль, особливо зправа на ліво та вверх вниз і шо це таке, в голові будуть не дані, а тарілки чи патрони які були в прикладі

11

Re: Стек, перевірка на наявність елементів

Я повністю змінив свій код тепер це стек ?
Якщо потрібно здійснити пошук по стеку як це зробить ? 

#include <iostream>
#include <conio.h>

using namespace std;

struct MyStruct
{
    int d;
    MyStruct *next;
};

void App(MyStruct *&Item,int d)
{
    MyStruct *pv = new MyStruct;
    pv->d = d;
    pv->next = Item;
    Item = pv;
}

void Print(MyStruct *&Item)
{
    cout << Item->d<<endl;
    MyStruct *pv = Item;
    Item = Item->next;
}

int main()
{
    MyStruct *el = NULL;
    App(el, 1);
    App(el, 2);
    App(el, 3);
    Print(el);
    Print(el);
    Print(el);
    getch();
    return 0;
}

12

Re: Стек, перевірка на наявність елементів

Це неправильний підхід.
По-перше, стек -то така структура, яка має всього дві операції: додати елемент (push) і витягнути елемент (pop). Друга операція у вас не реалізована (точніше, реалізована у вигляді операції Print - тобто єдине, що можна зробити із витягнутим елементом, це надрукувати його). Тобто має бути не
Print(el);
а
cout << Pop(el);
А по-друге, операція "пошук" на стеку не передбачена взагалі. Звісно, можете витягати, доки не знайдете, що треба, це і буде типу "пошук"; але стек при цьому знищується щонайменше до шуканого елемента. Переробіть Print на Pop, після цього пошук стає тривіальним.

Подякували: Betterthanyou1