Ahoj potřeboval, bych pomoct s úkolem, kde mám vytvořit zásobník a naprogramovat funkce pro praci s ním. Nevím si ale rady s funkcí reverse. Mohl by mi někdo poradit?
#include <stdio.h>
#include <stdlib.h>
struct stack_struct
{
char value;
struct stack_struct* next;
};
typedef struct stack_struct* Stack;
Stack empty_stack()
// funkce vraci prazdny zasobnik
{
return NULL;
}
int isempty_stack(Stack s)
// testuje, zda je zasobnik s prazdny (vraci 0 nebo 1)
{
return (s == NULL);
}
Stack push(const char value, Stack s)
// alokuje novy vrchol zasobniku a vlozi do nej znak value
{
// 1. naalokuji nove misto v pameti
Stack tmp = (Stack) malloc(sizeof(Stack));
// 2. ulozim do nej hodnotu value a ukazatel na stavajici zasobnik
tmp->value = value;
tmp->next = s;
// 3. vratim novy ukazatel tmp
return tmp;
}
Stack pop(Stack s)
// pokud zasobnik NENI prazdny, odebere vrchol ze zasobniku a uvolni pamet
{
if(isempty_stack(s))
// pokud je zasobnik prazdny, vratim prazdny zasobnik
{
return NULL;
}
else
// jinak vytvorim pomocny ukazatel tmp a nasmeruji jej na druhy prvek
// za vrcholem zasobniku
{
Stack tmp = s->next;
// uvolnim misto v pameti, kde je stary vrchol zasobniku
free(s);
// vratim ukazatel tmp na takto upraveny zasobnik
return tmp;
}
}
char top(Stack s)
// vraci hodnotu na vrcholu zasobniku
// pokud je zasobnik prazdny, vrati znak s ASCII kodem 0
{
if(isempty_stack(s)) return 0;
else return s->value;
}
void print_stack(Stack s)
// vypise vsechny hodnoty v zasobniku na standardni vystup
// pokud je zasobnik prazdny, vypise zpravu "Zasobnik je prazdny"
{
if(isempty_stack(s))
{
printf("Zasobnik je prazdny.");
}
else
// pokud zasobnik neni prazdny, vytvorim si pomocny ukazatel na vrchol
{
Stack tmp = s;
while(!isempty_stack(tmp))
// postupne tisknu hodnoty a prochazim zasobnik
{
printf("%c", top(tmp));
tmp = tmp->next;
}
}
printf("\n");
}
void reverse(const char* str)
// funkce, ktera vytiskne na standardni vystup retezec pozpatku
// (s vyuzitim zasobniku)
// predpokladejte, ze retezec je ukoncen ukoncovacim znakem (ASCII kod 0)
{
}
int main()
// hlavni funkce slouzi pro otestovani funkcnosti Vasi implementace
{
printf("\nTEST ZASOBNIKU\n\n");
printf("1. Vytvarim zasobnik\n");
Stack s = empty_stack();
printf(" Obsah zasobniku: ");
print_stack(s);
printf("2. Vkladam znak a\n");
s = push('a', s);
printf("3. Vkladam znak b\n");
s = push('b', s);
printf("4. Vkladam znak c\n");
s = push('c', s);
printf(" Vrchol zasobniku: %c\n", top(s));
printf(" Obsah zasobniku: ");
print_stack(s);
printf("5. Odebiram vrchol zasobniku\n");
s = pop(s);
printf(" Obsah zasobniku: ");
print_stack(s);
printf("6. Odebiram vrchol zasobniku\n");
s = pop(s);
printf(" Obsah zasobniku: ");
print_stack(s);
printf("7. Odebiram vrchol zasobniku\n");
s = pop(s);
printf(" Obsah zasobniku: ");
print_stack(s);
printf("8. Odebiram vrchol zasobniku\n");
s = pop(s);
printf(" Obsah zasobniku: ");
print_stack(s);
printf("\nTEST PREVRACENI RETEZCE:\n\n");
printf("Ahoj jak se mas? => ");
reverse("Ahoj jak se mas?");
return 0;
}