Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Помощ за сортиране на стек

Featured Replies

Условието е следното:

Да се състави програма, която да съдържа следните функции:

  • Съставяне на динамично представен стек с целочислени данни, съдържащи се във външен файл;

  • Сортиране не елементите в структурата по метод чрез сливане;

  • Намиране на минималният елемент, кратен на число въведено от клавиатурата с последващото му изтриване;

  • Запис на изходните резултати във външен файл.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>

using namespace std;

struct elem
{
    int key;
    elem *next;
}*s = NULL, *sor = NULL, *help = NULL, *krS = NULL, *n, *p;

void push(int n, elem *&st)
{
    elem *p;
    p = st;
    st = new elem;
    st -> key  = n;
    st -> next = p;
}

int pop(int &n, elem *&st)
{
    elem *p;
    if(st)
    {
        p  = st;
        n  = st -> key;
        st = st -> next;
        delete p;
        return 1;
    }
    else
        return 0;
}
elem* Split(elem* s1)
{
    elem* s2;

    if (s1 == NULL) return NULL;
    else if (s1 ->next == NULL) return NULL;
    else {
        s2 = s1 -> next;
        s1 -> next = s2 -> next;
        s2 -> next = Split(s2 -> next);
        return s2;
    }
}
elem* Merge(elem* m1, elem* m2)
{
    if (m1 == NULL) return m2;
    else if (m2 == NULL) return m1;
    else if (m1 -> key <= m2 -> key)
    {
        m1 -> next = Merge(m1 -> next, m2);
        return m1;
    }
    else
    {
        m2 -> next = Merge(m1, m2 -> next);
        return m2;
    }
}
elem* MergeSort(elem *ms1)
{
    elem *ms2;

    if (ms1 == NULL)
        return NULL;
    else if (ms1 -> next == NULL)
        return ms1;
    else
    {
        ms2 = Split(ms1);
        return Merge(MergeSort(ms1),MergeSort(ms2));
    }
}
int main()
{
    int ch, kr, num, min = 99999, ssize, br = 0;
    ofstream fout;
    do{
    cout << "               MENU\n"
         << "----------------------------------------------------\n"
         << "1. Vuvejdane na stek i zapisvaneto mu vuv fail.\n"
         << "2. Sortirane na steka i zapisvaneto mu vuv fail.\n"
         << "3. Namirane na minimalniq element kraten na chislo\n"
         << "   vuvedeto ot klaviaturata s posledvashtoto mu\n"
         << "   iztrivane i zapisvane vuv fail.\n"
         << "4. EXIT!!!\n"
         << "----------------------------------------------------\n"
         << "Vashiqt izbor: "; cin >> ch;
    switch(ch)
    {
        case 1:{cout << "Vuvedete broq na elementite na steka: \n"; cin >> ssize;
                srand(time(NULL));
                do{ num = rand()%1000-500; br++;
                    push(num,s);
                    push(num,sor);
                }while(br != ssize);
                fout.open("text.txt", ios::out);
                cout << "\nStack: ";
                fout << "Stack:\n";
                while(pop(num,s))
                {cout << num << ", ";
                fout << num << endl;}
                fout.close(); cout << endl; }break;
        case 2:{sor = MergeSort(sor);
                cout << "\nSorted stack: ";
                fout.open("text.txt", ios::app);
                fout << "\nSorted stack:\n";
                while(pop(num,sor)){
                    push(num,help);
                    cout << num << ", ";
                    fout << num << endl;
                }fout.close();
                cout<<endl;
                }break;
        case 3:{cout << "Kratnost: "; cin >> kr;
                while(pop(num,help)){
                    if((num%kr == 0)&&(num < min))
                        min = num;
                    else
                        push(num,krS); num = 0;}
                cout << "Min kraten element na chisloto " << kr << " e: " << min << endl;
                fout.open("text.txt", ios::app);
                fout << "Min kraten element na chisloto " << kr << " e: " << min << endl;
                fout.close();
                cout << "Steka sled iztrivane na min elem: \n";
                while(pop(num,krS))
                    cout << num << ", ";
                cout << endl;
                }break;
    }}while(ch != 4);

    system("pause");
    return 0;
}
Дотук добре, всичко 6 работи. Проблема е че сортировката е обхождане на списък, а аз имам  стек. И трябва да променя функцията Split  така, че да обхожда стек. Пробвах някакви варианти с pop, но като натисна 2 от менюто и програмата спира. Та ще ви помоля за помощ или някакви насоки за решаване на проблема...
#include <iostream>
#include <ctime>

using namespace std;

struct elem {
     int key;
     elem *next;
};

typedef elem *stack;

void push(stack &s, int n) {
     elem *p=new elem;
     p->key =n;
     p->next=s;
     s=p;
}

int pop(stack &s) {
    int n;
    elem *p=s;
    if (s==NULL) return 0;
    n=p->key;
    s=p->next;
    delete p;
    return n;
}

/********************************\
**     pos = 1  ascending sort  **
**     pos = 0 descending sort  **
\********************************/

void mergesort(stack &s, int pos) {
     
     if (s==NULL || s->next==NULL) return;
     
     stack  sl=NULL;
     stack  sr=NULL;
     // split
     while (s) {
          push(sl,pop(s));
          if (s) push(sr,pop(s));
     }
     mergesort(sl,!pos);
     mergesort(sr,!pos);
     // merge
     while (sl && sr)
     {
          if (pos ^ (sl->key < sr->key)) push(s,pop(sl));
          else push(s,pop(sr));
     }
     while (sl) push(s,pop(sl)); 
     while (sr) push(s,pop(sr));

}

int main () {
    int t, n=200;
    stack st=NULL;
    srand(time(NULL));
    for (int i=0; i<n; i++) {
        t = rand()%1000-500;
        cout<<t<<" ";
        push(st, t);
    }
    cout<<endl<<endl;
    mergesort(st,1);
    while (st) 
        cout<<pop(st)<<" ";
    cout<<endl;
    cin.get();
}

 

Редактирано от ined (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.