Witam,
mam problem z optymalizacją kodu. Mam funkcje, która przelicza wyrazenie na wejsciu np. w postaci ( ( ( ( ( 2 * 3 ) + 2 * 8 ) / 2 ) + 1 * ( 2 + 3 ) ) + 8 * 4 ). I problem w tym że takich danych wejsciowych jest np ich kilka tysiecy, przez co ta funkcja długo pracuje. Ma ktos pomysł jak zoptymalizować podany przeze mnie kod ? Oto kod tej funkcji:
void przeliczNaONP(const char* wejscie, char* wyjscie)
{
// W tej funkcji bufor bedzie nam sluzyl glownie do zamiany zmiennej typu char na jednoelementowy
// lancuch znakow (deklarujemy dwuelementowa tablice, poniewaz musi zostac miejsce na znak konca
// lancucha, '\0').
char bufor[2] = {'\0'};
int i = 0;
Stos s;
wyjscie[0] = '\0';
while (wejscie[i] != '\0') // (Warunek konca).
{
if (jestOperatorem(wejscie[i]))
{
// Jesli jest to operator unarny, oznaczymy go jako '#'.
if (wejscie[i] == '-')
{
if (wejscie[i+1] >= '0' && wejscie[i+1] <= '9')
{
// Traktujemy go jako liczbe.
i++;
char bufor[SMALL_BUFFER];
int j = 0;
while ((wejscie[i] >= '0' && wejscie[i] <= '9') || wejscie[i] == '.')
{
bufor[j] = wejscie[i];
j++;
i++;
}
bufor[j] = '#';
bufor[j+1] = ' ';
bufor[j+2] = '\0';
strcat(wyjscie, bufor);
continue;
}
}
if (!s.jestPusty())
{
while (jestOperatorem(s.szczyt->wartosc[0]))
{
char x = wejscie[i];
char y = s.szczyt->wartosc[0];
// Porownujemy oba operatory.
if (x == '+' || x == '-')
{
strcat(wyjscie, s.pobierz().wartosc);
strcat(wyjscie, " ");
}
else // x == '*' albo x == '/'
{
if (y != '+' && y != '-')
{
strcat(wyjscie, s.pobierz().wartosc);
strcat(wyjscie, " ");
}
else
{
break;
}
}
}
}
bufor[0] = wejscie[i];
Element* e = new Element(bufor, OPERATOR);
s.dodaj(e);
}
else if (wejscie[i] == '(')
{
Element* e = new Element("(", NAWIAS);
s.dodaj(e);
}
else if (wejscie[i] == ')')
{
while (strcmp(s.szczyt->wartosc, "(") != 0)
{
strcat(wyjscie, s.pobierz().wartosc);
strcat(wyjscie, " ");
}
// Zdejmujemy '(' ze stosu.
s.pobierz();
}
else if ((wejscie[i] >= '0' && wejscie[i] <= '9') || wejscie[i] == '.')
{
bufor[0] = wejscie[i];
strcat(wyjscie, bufor);
if (wejscie[i+1] == ' ')
{
strcat(wyjscie, " ");
}
}
else if (wejscie[i] != ' ')
{
// Zmienna. Wyszukujemy jej pelna nazwe i znajdujemy wartosc.
char bufor2[SMALL_BUFFER];
int b2i = 0;
while (wejscie[i] != ' ')
{
bufor2[b2i] = wejscie[i];
i++;
b2i++;
}
bufor2[b2i] = '\0';
for (int j = 0; j < tablicaZmiennych.ilosc; j++)
{
if (strcmp(bufor2, tablicaZmiennych.tablica[j].nazwa) == 0)
{
if (tablicaZmiennych.tablica[j].wartosc < 0.0)
{
sprintf(bufor2, ILOSC_MIEJSC_MINUS, -tablicaZmiennych.tablica[j].wartosc);
}
else
{
sprintf(bufor2, ILOSC_MIEJSC, tablicaZmiennych.tablica[j].wartosc);
}
strcat(wyjscie, bufor2);
strcat(wyjscie, " ");
break;
}
}
}
i++;
}
}
Struktura Stosu:
struct Stos
{
Element* szczyt;
Stos()
{
szczyt = NULL;
}
~Stos()
{
while (szczyt != NULL)
{
delete [] szczyt->wartosc;
szczyt = szczyt->next;
}
}
void dodaj(Element* e)
{
e->next = szczyt;
szczyt = e;
}
Element pobierz()
{
if (szczyt == NULL)
{
//cerr << "[!] Stos pusty.\n";
return Element();
}
Element e(szczyt->wartosc, szczyt->typ);
Element* adres = szczyt;
szczyt = szczyt->next;
delete [] adres->wartosc;
delete adres;
return e;
}
void czysc()
{
if (szczyt == NULL)
{
return;
}
do
{
Element* tmp = szczyt->next;
delete [] szczyt->wartosc;
delete szczyt;
szczyt = tmp;
} while (szczyt != NULL);
}
void wypisz()
{
if (szczyt == NULL)
{
//cerr << "[!] Stos pusty.\n";
return;
}
Element* tmp = szczyt;
do
{
tmp = tmp->next;
} while (tmp != NULL);
}
bool jestPusty()
{
if (szczyt == NULL)
{
return true;
}
else
{
return false;
}
}
};
Struktura Element
struct Element
{
char* wartosc;
Typ typ;
Element* next; // Element znajdujacy sie tuz pod obecnym (moze byc to NULL, jesli obecny
// element jest pierwszym na stosie).
Element()
{
wartosc = new char[strlen("???") + 1];
strcpy(wartosc, "???");
typ = BRAK;
next = NULL;
}
Element(const char* w, Typ t)
{
wartosc = new char[strlen(w) + 1];
strcpy(wartosc, w);
typ = t;
next = NULL;
}
};