5. Zásobník

5.2  Problém - Priehradkové triedenie

  Utrieďte N - prvkovú postupnosť K - ciferných prirodzených čísel. Využite metódu tzv. priehradkového triedenia, pri ktorom sa pre každú z číslic 0, 1, 2, ..., 9 zavedie jedna priehradka a vlastné triedenie prebieha takto:

V prvom prechode čísla zo vstupnej postupnosti zaraďujeme do priehradok podľa ich poslednej číslice. Potom čísla spojíme z priehradok do novej postupnosti. V ďalšom prechode čísla z tejto novej postupnosti zaraďujeme do priehradok podľa ich predposlednej číslice, potom čísla z priehradok vyberieme a spojíme do ďalšej novej postupnosti atď. Takto postupujeme až po rád K. Na konci tak získame usporiadanú postupnosť čísel.


Riešenie

Pri riešení využijeme dynamickú údajovú štruktúru zásobník. Použijeme jeden hlavný zásobník, do ktorého načítame vstupnú postupnosť čísel a desať pomocných zásobníkov predstavujúcich jednotlivé priehradky.

Pôjde o zásobníky s prvkami typu TPrvok:

typedef struct prvok {
   char cifry[K]; 
   struct prvok *dalsi;
} TPrvok;
Deklarujeme pointer na vrch hlavného zásobníka:

TPrvok *vrch;

Deklarujeme pole pointerov na pomocné zásobníky (priehradky):

TPrvok *priehradka[10];

Nech napríklad N = 7 a K = 2.
Vstupná číselná postupnosť: 43 27 31 15 37 80 03

vstup(&vrch);
for (i=0; i<10; i++) priehradka[i] = NULL;


Situácia po uložení vstupnej postupnosti do hlavného zásobníka a vytvorení prázdnych priehradok je na obrázku:


1. prechod:
Z hlavného zásobníka presunieme prvky do priehradok podľa cifry na mieste jednotiek.



Vyprázdnime priehradky presunutím prvkov z pomocných zásobníkov späť do hlavného (v cykle postupne od priehradky č. 0 po č. 9):



2. prechod:
Z hlavného zásobníka presunieme prvky do priehradok podľa cifry na mieste desiatok.



Vyprázdnime priehradky presunutím prvkov z pomocných zásobníkov späť do hlavného (v cykle postupne od priehradky č. 0 po č. 9):



Teraz už stačí len vypísať prvky z hlavného zásobníka na obrazovku.

Usporiadaná postupnosť: 80 43 37 31 27 15 03

  Pri načítavaní vstupnej postupnosti každé číslo "rozbijeme" na cifry! Navyše ak má číslo menej ako K cifier, doplníme potrebný počet núl zľava. Výsledná číselná postupnosť je usporiadaná zostupne.

[Program]