Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Segmentation fault - stosy

Ostatnio zmodyfikowano 2009-10-31 15:51
Autor Wiadomość
akasza666
Temat założony przez niniejszego użytkownika
Segmentation fault - stosy
» 2009-10-30 23:50:54
Witam!
Chciałam napisać program, który sprawdza czy da się ustawić wagony pociągu w kolejności za pośrednictwem 2 bocznic. Każda bocznica byłaby stosem, jednak po uruchomieniu mojego programu wyskakuje błąd z tematu.
Tak prezentuje się mój kod:
C/C++
#include<cstdio>
#include<stack>
main()
{
    int n, i, x = 0;
    bool z = 0;
    std::stack < int > A;
    std::stack < int > B;
    scanf( "%d", & n );
    int a[ n + 1 ];
    for( i = 1; i <= n; i++ )
         scanf( "%d", & a[ i ] );
   
    for( i = 1; i <= n; i++ )
    {
        if(( A.empty() ) ||( A.top() > a[ i ] ) )
             A.push( a[ i ] );
        else if(( B.empty() ) ||( B.top() > a[ i ] ) )
             B.push( a[ i ] );
        else
        {
            printf( "NIE" );
            z = 1;
            break;
        }
        if(( A.top() - 1 == x ) &&( A.empty() == false ) )
        {
            x = A.top();
            A.pop();
        }
        if(( B.top() - 1 == x ) &&( B.empty() == false ) ) //w tym miejscu pojawia się problem
        {
            x = B.top();
            B.pop();
        }
    }
    if( z == 0 )
         printf( "TAK\n" );
   
}
Dlaczego nie mogę odwoływać się do topu drugiego stosu??
P-11172
malan
» 2009-10-31 01:13:05
( B.top() - 1 == x )
Jeśli przez ten zapis chcesz dostać się do przed ostatniego elementu stosu to nie jest to (raczej) nie możliwe. Mi się wydaje, że lepiej by tu spełniała zadanie dynamiczna tablica,  ( tzn. std::vector<int>B ), np.:

C/C++
std::vector < int > B;
//...
if(( B[ B.size() - 2 ] == x ) && B.empty() == false )
{
    //...
}
Jeśli chcesz od ostatniego elementu odjąć '1' to spróbuj tak:
C/C++
if((( B.top() ) - 1 == x ) && //...
.chociaż to wiele nie zmienia.
P-11174
DejaVu
» 2009-10-31 06:14:49
Z bardzo prostego powodu: stos jest pusty, a Ty chcesz otrzymać referencję na element znajdujący się na szcycie stosu (czytaj: top() nie może być wołany, jeśli stos jest pusty).
P-11178
akasza666
Temat założony przez niniejszego użytkownika
» 2009-10-31 11:52:19
Dziękuje za rady. Okazało się, że po zamianie kolejności warunków (empty i top) program śmiga. Dopiero zaczynam przygodę ze stosami itp. Wydawało mi się że kolejność warunków złożonych jest dowolna, a jednak :D głupi błąd. Dziękuje!
P-11184
dmx81
» 2009-10-31 12:35:00
witam, troszke sie "wtrace" do tematu, chcialem zapytac, czy ow problem jest omowiony gdzies w kursach? jestem troszke po polowie kursu c++, a wiekszosc zapisow jest dla mnie calkowicie nowa - top itd, czy w nastepnych lekcjach jest to omowione, czy raczej powinienem szukac w innych zrodlach, dzieki.
P-11185
DejaVu
» 2009-10-31 15:51:26
Kurs STL'a jest osobno: http://kursy.ddt.pl/?TutorialId=11. Jest on bardzo wybrakowany, ale podstawy podstaw zostały w nim zawarte.
P-11188
« 1 »
  Strona 1 z 1