Program robiący Stack

0

Hej, od kilkunastu dni uczę się programowania w Javie

Próbuję napisać stos, ale mi nie działa. Może ktoś znajdzie błąd i chciałby powiedziec

class Stack
 {
    int MAX = 25, int top, int a[] = new int[MAX];
   
     boolean empty()
    {
        return (top < 0);
    }

    Stack()
    {
        top = -1;
    }
 
    boolean push(int x)
    {
        if (top >= (MAX - 1)) {
            throw new Exception();
        }
        else {
            a[top++] = x;
            return true;
        }
    }
 
    int pop()
    {
        if (top < 0) {
            throw new Exception();
        }
        else {
            return top[top - 1];
        }
    }
 
    int peek()
    {
        if (top < 0) {
            throw new Exception();
        }
        else {
            return a[top];
        }
    }
}
 
class Main {
    public static void main(String args[]) {
        Stack s = new Stack();
        s.push(10);
        s.push(20);
        s.push(30);
     
        System.out.println(s.pop());
    }
}
4

Tam nie powinno być zamiast

return top[top - 1];

to

return a[top--];

?

Piszę z tel na szybko ale top to zmienna a nie tablica.

2

To, co Bambo napisał, plus to, że plus powinny być przed zmienną: ++top oraz --top, bo inaczej będą nieprawidłowe indeksy (na początku jest -1,  więc pierwsze wywołanie push będzie chciało umieścić element o indeksie -1

(bo top++ zwróci to, co było wcześniej w zmiennej top i dopiero potem zwiększy samą zmienną).

2
pyton21cm napisał(a):

... ale mi nie działa ...

Na teraz i na przyszłość: wysil się z określeniem błędu, czy tu teraz na forum, czy na przyszłość jak będziesz coraz częściej (mam nadzieję) sam docierał do rozwiązania.

  • czy są jakieś komunikaty
  • w którym zakresie nie spełnia wymogów albo spodziewanego działania - czego się spodziewasz, a co jest.
  • czy lecą jakieś wyjątki

Tu na forum program nieco większy, z mniej czytelnym błędem określony jako "nie działa" będzie raczej wyśmiany niż uzyskasz pomoc. Tu zaszedł wyjątek, ze koledzy dostrzegli problem +/- 1. Zwykle słusznie dostaniesz coś o nie działającej szklanej kuli etc.

0

Idea wykorzystania wartości szczytowego elementu do określania rozmiaru stosu jest bardzo niebezpieczna. Tym bardziej, że metody pozwalają na wrzucenie na ten stos dowolnej liczby, a więc również wartości -1. Wystarczy raz wrzucić na stos taką wartość i Twoja klasa ślicznie się rozkraczy. ;)

Zadeklaruj sobie pole count i ustaw mu wartość 0 jako początkową. Podczas dodawania elementu, sprawdzaj czy count < MAX i jeśli jest, to inkrementuj count i wpisuj element do tablicy. Podczas zdejmowania elementu, sprawdź czy count > 0 i jeśli tak, odczytaj wartość i dekrementuj licznik. Natomiast metoda empty może po prostu testować pole count — żadnych specyficznych operacji do tego nie potrzeba.

Po mojemu coś takiego (nietestowane):

class Stack
{
    int SIZE_MAX = 25, int count = 0, int buffer[] = new int[SIZE_MAX];

    boolean empty()
    {
        return (count == 0);
    }

    boolean push(int x)
    {
        if (count < SIZE_MAX)
        {
            buffer[count++] = x;
            return true;
        }
        else
            throw new Exception();
    }

    int pop()
    {
        if (count > 0)
            return buffer[count--];
        else
            throw new Exception();
    }

    int peek()
    {
        if (count > 0)
            return buffer[count - 1];
        else
            throw new Exception();
    }
}
3

boolean push(int x)
    {
        if (top >= (MAX - 1)) {
            throw new Exception();
        }
        else {
            a[top++] = x;
            return true;
        }
    }


 boolean push(int x)
    {
        if (count < SIZE_MAX)
        {
            buffer[count++] = x;
            return true;
        }
        else
            throw new Exception();
    }

jaki sens ma metoda która zwraca true w przypadku powodzenia, a w innym przypadku rzuca wyjątkiem? Jak dla mnie takie API jest skrajnie nieintuicyjne. Dla stosu przechojącymi inty w metodzie push zwracałbym booleana, a pop/peek powinno zwracać OptionalInt

1 użytkowników online, w tym zalogowanych: 0, gości: 1