E17: Pilhas, ordenação digital, etc.

E17.1  O fragmento de programa abaixo manipula uma pilha de caracteres. As funções de manipulação da pilha são

 int pilhavazia ();
void empilha (char);
char desempilha ();
char espiapilha ();

A primeira devolve 1 se pilha está vazia e 0 em caso contrário. A segunda empilha um caracter. A terceira desempilha um caracter. A quarta devolve uma cópia do item que está no topo da pilha, mas não retira o item da pilha.  Diga, em português, o que o fragmento abaixo faz.

char x;
if (pilhavazia ()) empilha ('B');
else {
   if (espiapilha () != 'A')
      empilha ('B');
   else {
      while (!pilhavazia () && espiapilha () == 'A') 
         desempilha ();
      empilha ('B');
   }
}

Escreva um fragmento equivalente que seja bem mais curto e mais simples.

E17.2  Escreva uma versão especial de countingsort para o caso em que R vale 2.  Procure simplificar o código.

E17.3  Aplique o algoritmo de ordenação digital ao vetor de strings

no is th ti fo al go pe to co to th ai of th pa

E17.4  No algoritmo ordenaDigital(), diga o que acontece se trocarmos a linha  for (d = W-1; d >= 0; d--)  por  for (d = 0; d < W; d++).