E18: Documentação, código feio, pilhas

E18.1  Onde estão os erros?  Escreva uma documentação melhor.

// Recebe um vetor v com n elementos 
// e rearranja o vetor em ordem crescente
// usando o algoritimo Mergesort.
// Consome tempo proporcional a 3 n log n comparações.
//
void mrg_srt (int v[], int n);

E18.2  Por que esse código é feio?  Escreva versão melhor.

int verifica (int v[], int n) {
   int i, anterior = v[0], vai = 1;
   for (i = 1; i < n && vai; i++) {
      if (anterior > v[i]) vai = 0;
      anterior = v[i];
   }
   return vai;
}

E18.3  Por que esse código é feio?  Escreva versão melhor.

int verifica (int v[], int n) {
   int i;
   if (n > 1) {
      for (i = 1; i < n; i++) 
         if (v[i-1] > v[i]) return 0;
   }
   return 1;
}

E18.4  Escreva a expressão infixa equivalente à seguinte expressão polonesa:

A B C D E F - * - G H * - * + I 3 * -

E18.5  Digamos que nosso alfabeto contém apenas as letras a, bc.  Escreva uma função que determine se uma dada string X sobre nosso alfabeto é ou não da forma  WcM  onde W é uma sequência de letras que só contém a e b e M é o inverso de W  (ou seja, M é W lido de trás pra frente).  Dica: Suponha que você tem à sua disposição as funções usuais de manipulação de pilhas (empilha, desempilha e testa se a pilha está vazia).

E18.6  (Inspirado na pilha de execução de programas e na diretiva #include do compilador gcc.)  Começamos com um exemplo. Suponha dadas as seguintes listas de palavras:

0: banana batata
1: cadeira
2: camisa #0 calças #1 meias
3: gato #2 #0
4: #0 avião #2

Queremos que o comando execute #4 imprima a lista de palavras

banana batata avião camisa banana batata calças cadeira meias

Escreva uma função não-recursiva exec que faça isso. A função recebe um vetor v[0..n-1] de listas encadeadas (sem cabeça) cada uma de cujas cujas células

    struct cx {
       char      *str;
       struct cx *prox;
    };
    typedef struct cx celula;

contém uma palavra.  A função também recebe um índice k no intervalo 0..n-1 e tem a missão de imprimir a lista de palavras v[k] interpretando as palavras que começam com # de maneira especial.  Se uma palavra str começa com #, todos os caracteres depois de # são dígitos decimais e a palavra deve ser substituída pela lista de palavras v[atoi(str+1)], recursivamente.

Dica: Use uma pilha de ponteiros para células. Cada ponteiro contém o endereço da próxima célula a ser processada.