[C]Sprawdzenie poprawności wyrażenia matematycznego

0

Witam,
prosiłbym o pomoc w "rozkminie" zadania lub ewentualnej pomocy w napisaniu programika.
mam taki problem dostaję np. wyrażenie 2+3*5-3 i muszę sprawdzić jej poprawność.
Stworzyłem taką strukturę:

typedef struct e{
  char symbol;
  double x;
  struct e * lewy;
  struct e * prawy;
} drzewo;

Więc na podstawie struktury drzewo będzie wyglądać tak (http://upload.wikimedia.org/wikipedia/commons/d/db/Parsing-example.png):
+

2
*
3
5
3

Moim zadaniem jest sprawdzenie wyrażenie po kolei i przepisanie go do drzewa, a następnie sprawdzenie czy liśćmi drzewa są liczby, to wiem. Ale jak mam sprawdzać to wyrażenie? Po pierwszym napotkaniu znaku '+' badz '-' staje się on głównym korzeniem, następnie mam każdy taki znak układać w drzewa następnie przechodzić do znaków '*' i '/' a później przypisywać do drzewa liczby ?

Za wszelką pomoc z góry dziękuję.

0

Tyle, że mam to zrobić notacją infiksową, a ONP to notacja przyrostkowa.

0

A musisz też mieć nawiasy, czy nie?

Masz co najmniej dwie opcje. Pierwsza, to zrobienie z tego najpierw płaskiego ciągu (listy) tokenów. W najprostszym przypadku tokeny mogą być obiektami tej struktury drzewo (tak w ogóle to chyba dobrze by było nazwać ją jakoś inaczej, np. wezel/node, a nie "drzewo"). Tylko że na tym poziomie, tzw. analizy leksykalnej, nie dbasz jeszcze o ustawienie wskaźników lewy/prawy. Analiza leksykalna to tylko przetworzenie wejściowego ciągu znaków na obiekty. Po jej zakończeniu możesz zrobić z tej płaskiej listy drzewo, w drugim kroku, zwanym analizą składniową (parsowaniem).

Druga możliwość jest taka, byś robił wszystko "na bieżąco", tj. w jednym etapie. Tak to często robią z ONP, bo ta notacja jest tak prosta do zaprogramowania, jak tylko się da. Niestety dla ludzi jest nienaturalna.

I nie, nie sądzę, że najpierw powinieneś ustawić w drzewie operatory, a na końcu liczby. Rób je na bieżąco. Jak bieżący token to operator, to dodaj operator. Jak liczba, to dodaj liczbę.

Pewnym bólem przy budowaniu drzewa będzie priorytet operatorów.

0

Jeśli chcesz sprawdzić TYLKO poprawność wyrażenia to tworzenie drzew, parsowanie wyrażeń itd. jest zdecydowanie mnożeniem bytów ponad potrzebę.
Wystarczy że sprawdzisz czy:
1: liczba '(' i ')' jest taka sama
2: czy 2 operatory nie sąsiadują ze sobą (chyba że 2-gi to '-') (, chwilowo zaliczmy do operatorów)
3: czy znakiem następującym po '(' nie jest żedan ze znaków +/), i czy znakiem poprzedzającym ')' nie jest ',+-/'
4: cyfra ani , nie może poprzedzać '(' ani następować po ')'
5: w ciągu cyfr niepodzielonym +-*/() nie masz więcej niż 1 ','

Czyli sprawa upraszcza się do napisania 1 prostej pętli i 4-ech if-ów z jakimiś regexp-ami

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