1

Тема: Реалізувати програму через стек С++

Не можу розібратись зі стеком  *WALL*  Як цю програму можна реалізувати стеком?

#include <stdio.h>
#include <conio.h>
#include <locale>
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void main()
{
     setlocale(0,""); 
    int n=6;
    int a[6];
    int min;
    cout<<"Початковий стек"<<endl;
    int mi=0;
    for (int i=n;i>0;i--)
    {    
        a[i]=(rand()%20)-10;
        cout<<a[i]<<" ";    
    }
    min=a[0];
    for (int i=0;i<n;i++)
    {
        if (a[i]<min) 
            {
                min=a[i];
                mi=i;
            }
    }
    cout<<endl<<"Кiнцевий стек"<<endl;
    int t;
    int q=a[mi+1];
    int w=a[mi+2];
    a[mi+1]=w;  a[mi+2]=q;
    for (int i=n;i>0;i--)
    {
        cout<<a[i]<<" ";
    }
    min=100000;
    mi=-1;
    for (int i =n; i>0;i--)
    {if (a[i]<min) 
            {
                min=a[i];
                mi=i;
            }
    }
    cout<<endl<<"Мiн елемент: "<<min<<endl;
    _getch();
    exit(1);
}

2

Re: Реалізувати програму через стек С++

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

3 Востаннє редагувалося sn7770666k (23.05.2017 20:06:40)

Re: Реалізувати програму через стек С++

reverse2500 написав:

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

Ось моя програма...

#include <iostream> 
using namespace std;
struct Node
{ int data; Node *next;};
struct Queue
{
    int size;
    Node *first;
    Node *last;
};
void Creation(Queue *Q)
{
    Q->first = new Node;
    Q->first->next = NULL;
    Q->last = Q->first;
    Q->size = 0;
}
int Top(Queue *Q)
{
    return Q->first->next->data;
}
 
void Add(Queue *Q)
{
    int value;
    cout << "Znachenie -> ";
    cin >> value;
    Q->last->next = new Node;
    Q->last = Q->last->next;
    Q->last->data = value;
    Q->last->next = NULL;
    Q->size++;
    cout << "Element dobavlen\n";
}
int Size(Queue *Q)
{
    return Q->size;
}
 
void PrintOcher(Queue *Q)
{
    Node *X = Q->first->next;
    while(X)
    {
        cout << X->data << "=>";
        X = X->next;
    }
    cout << endl;
}
void UdMinEl(Queue *Q)
{
    Node *X = Q->first->next;
    int n = 0, pm=0, nm=0, min1 = X->data, min2 = X->data; 
    X = X->next;
    while(X)
    {
        n++;
        if(X->data < min1)
        {
            pm = n + 1;
            nm = n + 2;
            min1 = X->data;
            min2 = X->data;
        }
        X = X->next;
    }
    Node *X1=Q->first->next;
    for(int i = 1; i <= pm; i++)
      X1 = X1->next;
    X1->data = min2;
   X1 = Q->first->next;
    for(int i = 1; i <= nm; i++)
       X1 = X1->next;
     X1->data = min1;
}
int main()
{
    Queue Q;
    Creation(&Q);
    int n;
    cout << "Введіть кількість елементів - ";
    cin >> n;
    cout << "Введіть елементи черги\n";
    for(int i = 1; i <=n; i++)
    {
        Add(&Q);
    }
    cout << "*** Черга***\n";
    PrintOcher(&Q);
    UdMinEl(&Q);
    cout << "***Черга після перестановки***\n";
    PrintOcher(&Q);
    system("pause");
    return 0;
}

Тільки у цій функції, не розумію як присвоїти змінним значення потрібних елементів черги :( (змінні min1 i min2)

void UdMinEl(Queue *Q)
{
    Node *X = Q->first->next;
    int n = 0, pm=0, nm=0, min1 = X->data, min2 = X->data; 
    X = X->next;
    while(X)
    {
        n++;
        if(X->data < min1)
        {
            pm = n + 1;
            nm = n + 2;
            min1 = X->data;
            min2 = X->data;
        }
        X = X->next;
    }
    Node *X1=Q->first->next;
    for(int i = 1; i <= pm; i++)
      X1 = X1->next;
    X1->data = min2;
   X1 = Q->first->next;
    for(int i = 1; i <= nm; i++)
       X1 = X1->next;
     X1->data = min1;
}

Програма заміняє 2 наступні елементи мінімальним, а як зробити щоб 2 наступні помінялись місцями?

4 Востаннє редагувалося LoganRoss (23.05.2017 20:16:35)

Re: Реалізувати програму через стек С++

При чому тут ваша програма і стек? Ви знаєте що таке стек?
У вас у програмі просто заповнюється масив випадковими (одним і тим же посівом, між іншим) числами, знаходиться найменший елемент, а потім просто міняються місцями останні два елементи.

Так що конкретизуйте що ви хочете зробити і навіщо вам стек, яке взагалі ТЗ, інакше ніхто не зможе допомогти.

Тільки у цій функції, не розумію як присвоїти змінним значення потрібних елементів черги :( (змінні min1 i min2)

Так черга чи стек? Яка функція? Конкретніше будь ласка.

5

Re: Реалізувати програму через стек С++

LoganRoss написав:

При чому тут ваша програма і стек? Ви знаєте що таке стек?
У вас у програмі просто заповнюється масив випадковими (одним і тим же посівом, між іншим) числами, знаходиться найменший елемент, а потім просто міняються місцями останні два елементи.

Так що конкретизуйте що ви хочете зробити і навіщо вам стек, яке взагалі ТЗ, інакше ніхто не зможе допомогти.

Тільки у цій функції, не розумію як присвоїти змінним значення потрібних елементів черги :( (змінні min1 i min2)

Так черга чи стек? Яка функція? Конкретніше будь ласка.

Використовуючи стекову структуру, створити і вивести не впорядкований цифровий список. Поміняти два елементи місцями, що знаходяться після мінімального. Впахувати ситуацію кінця списку.
Можна це зробити?

6

Re: Реалізувати програму через стек С++

Ахаха, можна робіть.

Подякували: LoganRoss, ostap34PHP2

7

Re: Реалізувати програму через стек С++

Хоч якусь підказку можна?

8 Востаннє редагувалося LoganRoss (23.05.2017 20:56:09)

Re: Реалізувати програму через стек С++

sn7770666k написав:

Хоч якусь підказку можна?

контейнер
http://www.cplusplus.com/reference/stack/stack/.
http://cppstudio.com/uk/post/5155/

Заштовхуєте елементи в стек s1 за допомогою push. Сенс стека - LIFO. Тому ви не пройдетесь по ньому, вам необхідно буде витягувати елементи зі стека - витяг, запис в інший контейнер, нехай буде s2, щоб не втратити, видалити з s1 останній елемент, звіряти їх, присвоюючи проміжній змінній, знайти найменше. Після цього, заштовхувати поелементно назад в стек s1, і після того як заштовхнули найменший елемент, витягуєте з стека s2 останній елемент, присвоюєте якійсь змінні (хай буде var1), а сам елемент видаляєте з s2. Тоді заштовхуєте останній елемент з s2 в s1 і після нього заштовхуєте значення з var1. Так ви поміняєте два елементи після найменшого.

Це один з можливих алгоритмів. Можна взагалі написати свою структуру/клас і не використовувати контейнер stack.

9

Re: Реалізувати програму через стек С++

sn7770666k написав:

Хоч якусь підказку можна?

Так важко на вiкепедiю сходити?

Подякували: ostap34PHP, c3c2