Vypis retezce pozpatku pomoci zasobniku – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vypis retezce pozpatku pomoci zasobniku – C / C++ – Fórum – Programujte.comVypis retezce pozpatku pomoci zasobniku – C / C++ – Fórum – Programujte.com

 

LukasMegPrask
~ Anonymní uživatel
2 příspěvky
4. 3. 2013   #1
-
0
-

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;
}

Nahlásit jako SPAM
IP: 109.80.103.–
cibule0
Návštěvník
4. 3. 2013   #2
-
0
-

#1 LukasMegPrask
To je to nejlehčí ne?, proste metodou push tam vložiš znaky do zasobniku a metodou pop vypišeš znaky pozpatku

Nahlásit jako SPAM
IP: 85.70.207.–
4. 3. 2013   #3
-
0
-

algoritmus je jednoduchý:
1. skládám znaky do zásobníku = projedu zdrojový řetězec cyklem dokud nenarazím na znak s hodnotou 0x00. 
2. Vybírám znaky ze zásobníku a skládám je do cílového řetězce = v cyklu vybírám znaky dokud není zásobník prázdný, pak na konec cílového řetězce uložím znak s hodnotou 0x00.

Složitější situace nastane v případě, že před "převracením" řetězce bylo v zásobníku uloženo něco jiného (např návratová adresa - tohle jsem dělal docela často na 8051 v assembleru). Pak je třeba si pamatovat buď počet znaků položených do zásobníku nebo kde měl zásobník vrchol před zahájením "převracení".

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 47 hostů

Podobná vlákna

Výpis pozpátku — založil pes41

Výpis jména pozpátku — založil LUK4S3K

Výpis z řetězce — založil Dzanek

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý