Witam. Jestem studentem 1 roku informatyki. W ramach projektu mam za zadanie napisać kalkulator działający na bazie stosu. Program kompiluje, beż żadnych warningów, jednak nie wykonuje swojego zadania. Byłbym wdzięczny za wypisanie błędów jakie robię.
#include <stdlib.h>
#include <string.h>
struct stos
{
int znak;
struct stos* next;
};
//funkcja dodająca element
struct stos *push(struct stos *top, int liczba)
{
struct stos *nowy = (struct stos *)
malloc(sizeof(struct stos)); //rezerwacja pamieci
if(nowy != NULL) //sprawdza powodzenie rezerwacji pamieci
{
nowy->znak=liczba; //wpisanie liczby z parametru
nowy->next=top; //zapisanie adresu wskaznika stosu do next
top= nowy; // nowy jest nowym szczytem - ustawienie na niego wskaznika top
}
return top;
}
//funkcja usuwająca element
int pop(struct stos **top)
{
int wynik= -1;
if(*top) // if(*top!= NULL) - to samo, sprawdza czy przekazany funkcji wskaznik stosu nie jest pusty
{
wynik= (*top)->znak; //zapisuje wartosc z el na szczycie, ktory funkcja wyswietli na koncu
struct stos *tmp = (*top)->next; //zapamietuje adres elementu next ze szczytowego
free(*top); //usuniecie elementu szczytowego
*top=tmp; // przypisanie adresu ze zmiennej tmp do szczytu stosu(nowego szczytu)
}
return wynik;
}
//funkcja wyświetlajaca element
int peek(struct stos *top)
{
if(top) //top!=NULL
return top->znak;
else {
fprintf(stderr,"Stos nie istnieje.\n"); //jesli stos jest pusty to wyswietl napis
return -1;
}
}
int main() {
struct stos *top=NULL;
//Wprowadzenie wyrażenia
int i=0;
char wyrazenie[]={"22+="}; // sposob wprowadzania do zmiany
//wyswietlenie wprowadzonego wyrażenia
puts("Wprowadzone wyrazenie: ");
while(wyrazenie[i])
{
printf("%c",wyrazenie[i]);
i++;
}
puts("\n");
//Sprawdzanie poszczególnych opcji
int j=0;
while(wyrazenie[j])//bedzie wykonywalo dopóki wyrazenia w tablicy będą różne od null
{
if(wyrazenie[j]=='+') //dodawanie
{
int liczba1;
liczba1=top->znak;
pop(&top);
int liczba2;
liczba2=top->znak;
pop(&top);
int wynik;
wynik=liczba1+liczba2;
push(top,wynik);
}
else if(wyrazenie[j]=='-') //odejmowanie
{
int liczba1;
liczba1=top->znak;
pop(&top);
int liczba2;
liczba2=top->znak;
pop(&top);
int wynik;
wynik=liczba1-liczba2;
push(top,wynik);
}
else if(wyrazenie[j]=='*') //mnozenie
{
int liczba1;
liczba1=top->znak;
pop(&top);
int liczba2;
liczba2=top->znak;
pop(&top);
int wynik;
wynik=liczba1*liczba2;
push(top,wynik);
}
else if(wyrazenie[j]='/') //dzielenie
{
int liczba1;
liczba1=top->znak;
pop(&top);
int liczba2;
liczba2=top->znak;
pop(&top);
int wynik;
wynik=liczba1/liczba2;
push(top,wynik);
}
else if(wyrazenie[j]=='=') //koniec ciagu znakow- wyswietlenie ostatniego (jedynego) elementu stosu
{
puts("wynik to:");
peek(top);
}
else //liczba w tablicy- dodanie do stosu
{
int do_zapisu;
char do_zapisu1;
wyrazenie[j]=do_zapisu1;
do_zapisu=(int)do_zapisu1;
push(top,do_zapisu);
}
j++;
}
return 0;
}