• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konwersja postaci infiksowej do ONP - stos (błąd 0xC0000005)

Aruba Cloud - Virtual Private Server VPS
0 głosów
179 wizyt
pytanie zadane 21 marca 2023 w C i C++ przez bananen Nowicjusz (170 p.)
edycja 21 marca 2023 przez bananen

Hej, moim zadaniem jest stworzyć stos z użyciem wskaźników, który będzie przekształcał wyrażenie z postaci infiksowej na ONP. Założenia: brak spacji, liczby jednocyfrowe.
Kod jest, poszczególne funkcje działają, mam jednak jakiś błąd w pętli for, który powoduje błąd. Przejrzałam już kod wiele razy i nie dostrzegam, co jest źle. Czy mogę prosić o pomoc? Gdzie tu jest błąd, który powoduje, że program nie działa?

Po wpisaniu danych program zwraca 'Process returned -1073741819 (0xC0000005)'.

#include <iostream>
#include <string>
using namespace std;

//Stos typu char
struct wezel{
    wezel* nastepny;
    char wartosc;
};

struct stos{
    wezel* wierzch;
    unsigned int rozmiar;
};

void inicjalizujStos(stos *s){
    s->wierzch = NULL;
    s->rozmiar = 0;
}

bool czyPusty(stos *s){
    return s->rozmiar == 0;
}

void push(stos *s, char x){
    wezel* nowy = new wezel;
    nowy->nastepny = s->wierzch;
    nowy->wartosc = x;
    s->wierzch = nowy;
    s->rozmiar++;
}

char pop(stos *s){
    if(czyPusty(s))
        return INT_MIN;

    char x = s->wierzch->wartosc;
    wezel* temp = s->wierzch;
    s->wierzch = s->wierzch->nastepny;
    delete temp;
    s->rozmiar--;
    return x;
}

char top(stos *s){
    return s->wierzch->wartosc;
}

void zniszczStos(stos *s){
    while(!czyPusty(s))
        pop(s);
    inicjalizujStos(s);
}


//funkcje pomocnicze
bool czy_dzialanie(char x){
    if(x == '+' || x == '-' || x == '*' || x == '/'){
        return true;
    }
    else{
        return false;
    }
}

int priorytet(char x){
    if(x == '*' || x == '/'){
        return 2;
    }
    if(x == '+' || x == '-'){
        return 1;
    }
}


int main(){
    stos *Znaki = new stos;
    inicjalizujStos(Znaki);

    string wyrazenie;
    string onp = "";

    cout << "Podaj wyrazenie w notacji infiksowej: ";
    cin >> wyrazenie;

   for(int i = 0; i < wyrazenie.length(); i++){
        if(wyrazenie[i] >= '0' && wyrazenie[i] <= '9'){
            onp = onp + wyrazenie[i];
        }
        else if(wyrazenie[i] == '('){
            push(Znaki,wyrazenie[i]);
        }
        else if(wyrazenie[i] == ')'){
            while(top(Znaki) != '('){
                onp = onp + pop(Znaki);
            }
            pop(Znaki);
        }
        else if(czy_dzialanie(wyrazenie[i])){
            while(czy_dzialanie(top(Znaki)) && (priorytet(top(Znaki)) >= priorytet(wyrazenie[i]))){
                onp = onp + pop(Znaki);
            }
            push(Znaki,wyrazenie[i]);
        }
    }

    while(!czyPusty(Znaki)){
        onp = onp + pop(Znaki);
    }

    cout << onp;

    return 0;
}

 

komentarz 21 marca 2023 przez j23 Mędrzec (195,240 p.)
Podaj może działanie, przy którym program się wysypuje, Testowałem parę prostych działań i wszystko było ok, żadnych błędów.
komentarz 21 marca 2023 przez bananen Nowicjusz (170 p.)
Wysypuje mi się przy każdym, nawet tych najprostszych.
2+3
2*(3+5)

1 odpowiedź

0 głosów
odpowiedź 21 marca 2023 przez tangarr Mędrzec (155,140 p.)
wybrane 22 marca 2023 przez bananen
 
Najlepsza
Zdebugowałem na szybko: Wywala się na funkcji top. Zmienna s->wierzch jest nullem, dlatego wywala się na s->wierzch->wartosc
komentarz 22 marca 2023 przez bananen Nowicjusz (170 p.)
edycja 22 marca 2023 przez bananen
To jest to. Dziękuję :)

Podobne pytania

0 głosów
1 odpowiedź 654 wizyt
pytanie zadane 2 kwietnia 2020 w C i C++ przez SensejChmiel Nowicjusz (180 p.)
0 głosów
0 odpowiedzi 475 wizyt
0 głosów
1 odpowiedź 212 wizyt
pytanie zadane 5 stycznia 2017 w Rozwój zawodowy, nauka, praca przez Barteck125 Obywatel (1,120 p.)

93,335 zapytań

142,331 odpowiedzi

322,415 komentarzy

62,670 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...