Você está na página 1de 36

1

Apostila de Algoritmos e Estrutura de Dados II 30-703 4 crditos


EMENTA: Anlise e projeto dos tipos de dados abstratos, estruturas de dados e suas aplicaes: listas lineares, pilhas, filas.
Mtodos e tcnicas de classificao de dados.
OBJETIVOS: Ao final desta disciplina o aluno dever ser capaz de definir foralente estruturas de dados, anipular estas
estruturas, selecion!las e utiliz!las e suas aplicaes.
RELAO DOS CONTEDOS:
Conceitos Iniciais
! "ntroduo: tipos priitivos de dados, vetores, atrizes, estruturas #structs$.
! %ipos abstratos de dados #%A&s$
! 'epresentao e ipleentao de %&A.
Recursiviae
! &efinio, e(eplos, siulao e ipleentao de recursividade. )(erc*cios
Listas "ineares
! &efinio, estruturas estticas e din+icas, operaes bsicas e listas de eleentos.
#i"$as
! &efinio do tipo abstrato, aplicaes e e(eplos
! ,peraes bsicas e ua pilha
! )(erc*cios e "pleentaes de pilhas
%i"as
! &efinio do tipo abstrato, aplicaes e e(eplos
! ,peraes bsicas e ua fila
! -ilas circulares
! )(erc*cios e "pleentaes de filas
C"assi&ica'(o
! .istas ordenadas. Mtodos de classificao de dados por:
! "nsero #direta e increentos decrescentes$
! %roca # bolha e partio$
! /eleo #seleo direta e e rvore$
! distribuio e intercalao
Listas "i)aas
! 0ilhas li1adas
! -ilas lidadas
! .istas li1adas
! .istas duplaente li1adas
! )(erc*cios e "pleentaes
BIBLIO*RA%IA B+SICA ,LIVROS TE-TOS.:
%)2)M3A4M, Aaron M. Estrutura e Daos /sano C. /o 0aulo: Ma5ron 3oo5s do 3rasil, 1667.
8)..,/,, 0aulo. Estruturas e Daos. 'io de 9aneiro: )d. :apus, 1661.
8"..A/, Marcos 8 ; ,utros. Estruturas e Daos: Conceitos e T0cnicas e i12"e1enta'(o3 '9: )d. :apus, 166<.
BIBLIO*RA%IA COM#LEMENTAR:
/=")2A, /teven> 'evilla, Mi)ue"3 #ro)ra11in) C$a""en)es3 /prin1er!8erla1 2e? @or5, ABB<.
48A ,nline 9ud1e http:CCicpcres.ecs.baDlor.eduConlinejud1eC
AE)')&,, 0aulo A. M0toos e C"assi&ica'(o e Daos. 'io de 9aneiro: )d. :apus, 166F.
AVALIAO3: A avaliao consistir de < notas #prova1 G provaA G trabalho$ C <, sendo Hue os trabalhos sero os
probleas propostos e cada cap*tulo, Hue deve ser desenvolvidos e laboratIrio
A
43 Conceitos Iniciais

434 Ti2o e aos

Assue!se Hue cada constante, varivel, e(presso ou funo u certo tipo de dados. )sse tipo refere!se
essencialente ao conjunto de valores Hue ua constante varivel, etc. pode assuir.
Ti2o 2ri1itivos e aos:
)ssencialente so os nJeros, valores lI1icos, caracteres, etc Hue so identificados na aioria das lin1ua1ens:
int: copreende os nJeros inteiros &"oat: copreende os nJeros reais c$ar: copreende os caracteres
435 Vetor ou Arra6
AK1BL ! 2oe do vetor e u *ndice para localizar.
F M N 11 A 1< O N 6 1
aKBL aK1L aKAL aK<L aKNL aK7L aKFL aKOL aKML aK6L

O2era'7es co1 vetor:
/oe o 1P e o Jltio eleento do vetor na varivel (: ( Q aKBL G aK6L ( Q F G 1
E8erc9cio:
:alcule a dia dos eleentos do vetor:
#include <iostream>
using namespace std;
float media (int vet2[10]);
int main(void){
int i, vet[10];
for (i=0; i<10; i++)
cin >> vet[i];
float x = media(vet);
cout << "Mdia= " << x;
return (0);
}
float media (int vet2[10]){
float soma = 0;
for (int i = 0 ; i <10; i++)
soma += vet2[i];
return (soma/10);
}
Vetores :ii1ensionais e1 C:
int a[5][2] #7 linhas e A colunas$ int a[3][5][2] #< planos, 7 linhas e A colunas$

%or1as 1ais si12"es e ec"arar u1a estrutura e1 C:
struct {
char primeiro[10];
char inicialmeio;
char ultimo[20];
} nome;
typedef struct {
char primeiro[10];
char inicialmeio;
char ultimo[20];
} TIPONOME;
TIPONOME nome, snome, fulano;
O:s: e todos os casos a inicialeio apenas u caracter. )(eplo.: 0edro /. 3arbosa
#include <iostream>
using namespace std;
typedef struct {
string nome;
string endereco;
string cidade;
} CADASTRO;
<
int main (void) {
CADASTRO cliente;

cout << "Digite o Nome: ";
getline (cin, cliente.nome);
cout << "Digite o Endereco: ";
getline (cin, cliente.endereco);
cout << "Digite o Cidade: ";
getline (cin, cliente.cidade);
cout << cliente.nome << " mora no(a) " << cliente.endereco << " , cidade de " << cliente.cidade;
return 0;
}

43; Ti2os a:stratos e aos
-undaentalente, u %&A si1nifica u conjunto de valores e as operaes Hue sero efetuadas sobre esses
valores. 2o se leva e conta detalhes de ipleentao. 0ode ser at Hue no seja poss*vel ipleentar u %&A
desejado e ua deterinada lin1ua1e.
:oo na atetica diferenciaos constantes, funes, etc., na infortica identificaos os dados de acordo co
as suas caracter*sticas. 0or e(eplo, se criaros ua varivel do tipo fruta, ela poderia assuir os valores 2era,
1a'(, etc., e as operaes Hue poder*aos fazer sobre esta varivel seria co12rar< "avar, etc.
Ruando al1u Huer usar u %&A SinteiroT, ele no est interessado e saber coo so anipulados os bits de
Uard?are para Hue ele possa usar esse inteiro. , %&A inteiro universalente ipleentado e aceito.
De&ini'(o e u1 TDA Raciona"
A definio de u %&A envolve duas partes: a definio de valores e a definio de operadores. , %&A 'acional
consiste e dois valores inteiros, sendo o se1undo deles diferente de zero #B$. #nuerador e denoinador$.
A definio do %&A racional, por e(eplo, inclui operaes de criao, adio, ultiplicao e teste de i1ualdade.
A[0] B[0] A[0] * B[1] + A[1] * B[0]
---- + ---- = -------------------------
A[1] B[1] A[1] * B[1]

I12"e1enta'(o o ti2o RACIONAL

"nicialente deve!se criar ua estrutura denoinada racional, Hue cont u nuerador e u denoinador e
posteriorente cria!se u pro1raa Hue utiliza as estruturas criadas. Abai(o se1ue o e(eplo. :rie as operaes de
so1a< 1u"ti2"ica'(o e so1a co1 si12"i&ica'(o sobre nJeros racionais e laboratIrio.
#include <iostream>
using namespace std;
typedef struct {
int numerador;
int denominador;
} RACIONAL;
RACIONAL r1,r2,soma, mult, simpl;
int main(void){
int i;
cout << "Digite o 1ro numerador:; cin >> r1.numerador;
cout << "Digite o 1ro denominador:"; cin >> r1.denominador;
cout << "Digite o 2do numerador:; cin >> r2.numerador;
cout << "Digite o 2do denominador:"; cin >> r2.denominador;
...
return (0);
}
N
53 Recursiviae
4 al1orito Hue resolve u problea 1rande e probleas enores, cujas solues reHuere a aplicao dele
eso, chaado recursivo.
)(iste dois tipos de recursividade: direta e indireta:
Direta: ua rotina ' pode ser e(pressa coo ua coposio forada por u conjunto de coandos : e ua
chaada recursiva V rotina ': ' K:,'L
Indireta: as rotinas so conectadas atravs de ua cadeia de chaadas sucessivas Hue acaba retornando V prieira
Hue foi chaada:
'1 K:1,'AL 'A K:A,'1<L ... 'n K:n,'1L
/so a recursiviae na so"u'(o e 2ro:"e1as:
)(: clculo de fatorial:
BW Q 1 CC dado por definio
nW Q nX#n!1$ CC reHuer reaplicao da rotina para #n!1$W
8eja a funo:
Funo fat(n)
Incio
Se n=0 ento retorne (1)
Seno retorne (n*fat(n-1)) //chamada recursiva
Fim;
#ro:"e1a as torres e =anoi: :onsiderando trYs torres, o objetivo transferir trYs discos Hue esto na torre A
para a torre :, usando ua torre 3 coo au(iliar. /oente o Jltio disco de cia de ua pilha pode ser deslocado
para outra, e u disco aior nunca pode ser colocado sobre u enor.
&essa fora, para over n discos da torre A para a torre :, usando a torre 3 coo au(iliar, fazeos:
se n Q 1
ova o disco de A para :
sen(o
transfira n!1 discos de A para 3, usando : coo au(iliar
ova o Jltio disco de A para :
transfira n!1 discos de 3 para :, usando A coo au(iliar
B
A
F
: 3 A
N
3 A
:
1
<
7
O
7
0rieira etapa:
se n Q 1
ova o disco de A para : #se au(iliar$ #ori1e para destino$
sen(o
transfira n!1 discos de A #ori1e$ para 3 #destino$, usando : #au(iliar$
ova disco n de A para : #ori1e para destino$
transfira n!1 discos de 3 #ori1e$ para : #destino$, usando A #au(iliar$
/e1unda etapa: :oo a passa1e dos par+etros sepre: torre A, torre 3 #au(iliar$ e torre :, pois esta a
seHZYncia das < torres, os par+etros deve ser anipulados na chaada recursiva da rotina Uanoi, respeitando a
lI1ica dos al1oritos:
0ro1raa principal:
incio
limpa tela
hanoi(3,'A','B','C')
fim
'otina Uanoi:
Hanoi (int n, char origem, auxiliar, destino);
incio
se (n=1) ento
Escrever(1. Mova disco 1 da torre, origem, para , destino)
seno
Escrever(2.)
Hanoi( n-1 , origem , destino , auxiliar)
Escrever(3. Mova disco ,n, da torre, origem, para ,destino)
Hanoi( n-1 , auxiliar , origem , destino)
fimse
fim
Co1 a c$a1aa $anoi,;<>A><>B><>C>.< o 2ro)ra1a 2rou?ir@ a se)uinte sa9a:
2.
2.
1. Mova disco ! da torre A para C
3. Mova disco " da torre A para B
1. Mova disco ! da torre C para B
3. Mova disco # da torre A para C
2.
1. Mova disco ! da torre B para A
3. Mova disco " da torre B para C
1. Mova disco 1 da torre A para C
S0rie e %i:onacci
A srie de -ibonacci a se1uinte: B, 1, 1, A, <, 7, M, 1<, A1, <N, ...
0ara fins de ipleentao, a srie inicia co fib#B$ e cada tero n referenciado por fib#n!1$, ou seja o 1
o
tero
fib#B$, o A
o
tero fib#1$ e assi sucessivaente. :o e(ceo dos dois prieiros, cujos valores so pr!
deterinados #B e 1$, cada eleento da seHZYncia sepre ser a soa dos dois eleentos anteriores. )(:
fib#A$ Q BG1 Q A, fib#<$ Q 1G1 Q A, fib#N$ Q AG1 Q <, fib#7$ Q AG< Q 7, ...
0odeos ento definir a srie de -ibonacci atravs da se1uinte definio recursiva:
Fib(n) = n se n== 0 ou n==1
Fib(n) = Fib(n-2) + fib(n-1) se n >=2
&essa fora, -ib#N$ seria ento:
Fib(4) = Fib(2) + Fib(3) =
Fib(0) + Fib(1) + Fib(3) =
0 + 1 + Fib(3) =
1 + Fib(1) + Fib(2) =
1 + 1 + Fib(0) + Fib(1) =
2 + 0 + 1 = 3
A C
A B C
A C
A B C
A B C
fib(0) fib(1) fib(2) fib(3) fib(4) fib(5) fib(6) ...
F
;3 Estruturas e Daos E"e1entares
)struturas de dados so o ScoraoT de HualHuer pro1raa ais sofisticado. A seleo de u tipo correto de
estrutura de dados far enore diferena na cople(idade da ipleentao resultante. A escolha da representao
dos dados correta facilitar e uito a construo de u pro1raa, enHuanto Hue a escolha de ua representao
errada custar u tepo enore de codificao, al de auentar a cople(idade de copreeno do cIdi1o.
)ste cap*tulo apresentar probleas clssicos de pro1raao co estruturas de dados fundaentais,
principalente probleas clssicos envolvidos e jo1os de coputadores.
:onsideraos aHui as operaes abstratas sobre as ais iportantes estruturas de dados: pilhas, filas, dicionrios,
filas co prioridades e conjuntos.
.in1ua1ens odernas orientadas a objetos coo :GG e 9ava possue bibliotecas padres de estruturas de dados
fundaentais. 0ara u aluno de curso de :iYncia de :oputao, iportante entender e saber construir as rotinas
bsicas de anipulao destas estruturas, as por outro lado, uito ais iportante saber aplic!las corretaente
para solucionar probleas prticos ao invs de ficar reinventando a roda.
;343 #i"$as
0ilhas e filas so contYiners onde os itens so recuperados de acordo co a insero dos dados. 4a 2i"$a u
conjunto ordenado de itens na Hual todas as inseres e retiradas so feitas e ua das e(treidades denoinada
To2o. 0ilhas ant a orde #.ast "nput -irst ,utput$. As operaes sobre pilhas inclue:
0ush#(,s$: insere o ite ( no topo da pilha s.
0op#s$: retorna e reove o ite do topo da pilha s.
"nicialize#s$: cria ua pilha s vazia.
-ull#s$, )ptD#s$: testa a pilha para saber se ela est cheia ou vazia.
2otadaente no poder haver operao de pesHuisa sobre ua pilha. A definio das operaes abstratas acia
perite a construo de ua pilha e sua reutilizao se a preocupao co detalhes de ipleentao. A
ipleentao ais siples utiliza u vetor e ua varivel Hue controla o topo da pilha. A ipleentao co
eleentos li1ados atravs de ponteiros elhor porHue no ocasiona overflo?.
4 e(eplo de pilha seria ua pilha de pratos. Ruando u prato lavado ele colocado no topo da pilha. /e
al1u estiver co foe, ir retirar u prato tab do topo da pilha. 2este caso ua pilha ua estrutura
apropriada para esta tarefa porHue no iporta Hual ser o prI(io prato usado.
,utros casos e(iste onde a orde iportante no processaento da estrutura. "sso inclui fIrulas paraetrizadas
#push e u S#S, pop e u S$T$ ! ser visto adiante, chaadas recursivas a pro1raas #push e ua entrada de
funo, pop na saida$ e busca e profundidade e 1rafos transversais #push ao descobrir u vrtice, pop Huando ele
for visitado pela Jltia vez$
-uncionaento:
)(: )ntrada: A, 3, :, &, ), -
/eHZYncia: " " ' " " ' " ' ' " ' '
/a*da: B D E C % A
E8erc9cios:
1$ :oplete:
a$ )ntrada: , & & A
/eHZYncia: " " " ' " ' ' '
/a*da:
b$ )ntrada: " ) 2 / ' )
/eHZYncia: " ' " " ' " ' " " ' ' '
/a*da:
A
B
C
D
O
A$ :oplete:
a$ )ntrada: ,,A,&,&,/
/eHZYncia:
/a*da: &,A,&,,,/
b$ )ntrada: ),),[,),:,),.,2,%
/eHZYncia:
/a*da: ),[,:,),.,),2,%,)
<$ :oplete:
a$ )ntrada:
/eHZYncia: ",",',",",',',",'
/a*da: &,A,&,,,/
b$ )ntrada:
/eHZYncia: ",",",',",",",',",",",',',',',',','
/a*da: ),[,:,),.,),2,%,)
I12"e1enta'(o:
0ilha#B$ 0ilha#1$ 0ilha#A$ 0ilha#<$ 0ilha#N$ 0ilha#7$
%opo "n*cio -i "nsero
'etirada

0ara ipleentaros ua pilha seHZencial precisaos de ua varivel #%opo$ indicando o endereo da ais recente
inforao colocada na pilha. 0or conveno, se a pilha est vazia, o %opo Q !1. , taanho da 0ilha liitado pelo
taanho do vetor.
Typedef struct PILHA {
int topo;
char dados[10];
}
PILHA p;
;34343 Inser'(o
Na inser'(o eve!se:
X increentar o topo da pilha
X arazenar a inforao [ na nova rea
;3435 Retiraa
Na retiraa eve!se:
X obter o valor presente e pilha.topo ou pilha!\topo.
X decreentar o topo da pilha
, Hue acontece ao se inserir ua inforao Huando j
usaos toda a rea dispon*vel do vetor #topo Q fi$ ]
Res2osta: ocorre ua situao denoinada ^^^^^^^^^^
A")orit1o e inser'(o:
, Hue acontece Huando tentaos retirar u eleento de ua
pilha Hue j est vazia]
Res2osta: ocorre ua situao denoinada ^^^^^^^^^^^^^
A")orit1o e retiraa:
M
#include <iostream>
#define $%& !'
using namespace std;
typedef struct {
int topo;
int dados [TAM];
} PILHA;
PILHA p1;
... Implemente o resto.
Co1o 2oeria ser &eita a inser'(o e retiraa no caso e se uti"i?ar 1ais o Aue u1a 2i"$aB
! deve!se utilizar ponteiros para indicar Hual das pilhas ser anipulada e Hual o seu endereo.
Di&eren'as entre o a")orit1o Aue 1ani2u"a u1a 2i"$a e o a")orit1o Aue 1ani2u"a v@rias 2i"$as:
a$ deve!se passar A par+etros na insero: a pilha e Hue o eleento ser inserido e o eleento a ser inserido>
b$ deve!se inforar a pilha da Hual o eleento ser retirado>
c$ na chaada das funes insere e retira deve!se passar o endereo da estrutura e dentro da funo deve!se
indicar Hue est vindo u ponteiro>
d$ deve se usar a referYncia pilha!\topo ao invs de pilha.topo.
Pilha p1,p2,p3;

void empilha (struct stack *p, int x){
...
}
int desempilha(struct stack *p ){
...
}
int main(void){
int x;
pilha1.topo=-1; pilha2.topo=-1; pilha3.topo=-1;
empilha(&pilha1,4); empilha(&pilha2,2); empilha(&pilha3,7);
x=desempilha(&pilha1); cout << x << endl;
x=desempilha(&pilha1); cout << x << endl;
x=desempilha(&pilha2); cout << x << endl;
return (0);
}
I12"e1ente e1 "a:oratCrio:

1$ "pleente a rotina epilha e a rotina desepilha, deonstrando visualente coo fica a estrutura #pilha$ apIs
cada ua das operaes. ,bs.: "pleente a pilha sobre u vetor co 1B posies.

A$ :onstrua u pro1raa Hue leia 1B valores e epilha!os confore fore pares ou *pares na pilha1 e pilhaA
respectivaente. 2o final desepilhe os valores de cada pilha ostrando!os na tela.
3.1.3 Utilizao pratica de pilhas - Avaliao de Expresses
A1ora Hue definios ua pilha e indicaos as operaes Hue pode ser e(ecutadas sobre ela, vejaos coo
podeos usar a pilha na soluo de probleas. )(aine ua e(presso atetica Hue inclui vrios conjuntos de
parYnteses a1rupados. 0or e(eplo:
7-(( X *((X + Y) / (J - 3)) + Y) / (4 - 2.5))
Ruereos 1arantir Hue os parYnteses esteja corretaente a1rupados, ou seja, desejaos verificar se:
a$ )(iste u nJero i1ual de parYnteses esHuerdos e direitos.
)(presses coo SA((A + B)T ou SA + B(T viola este critrio.
b$ %odo parYntese da direita est precedido por u parYntese da esHuerda correspondente.
)(presses coo S)A+B(-CT ou S(A+B))-(C+DT viola este critrio.
6
0ara solucionar esse problea, ia1ine cada parYntese da esHuerda coo ua abertura de u escopo, e cada
parYntese da direita coo u fechaento de escopo. A 2ro&uniae o anin$a1ento #ou 2ro&uniae o
a)ru2a1ento$ e deterinado ponto nua e(presso o nJero de escopos abertos, as ainda no fechados nesse
ponto. "sso corresponder ao nJero de parYnteses da esHuerda encontrados cujos correspondentes parYnteses da
direita ainda no fora encontrados.
&eterineos a conta)e1 e 2arDnteses e deterinado ponto nua e(presso coo o nJero de parYnteses da
esHuerda enos o nJero de parYnteses da direita encontrados ao rastear a e(presso a partir de sua e(treidade
esHuerda at o ponto e Huesto. /e a conta1e de parYnteses for no!ne1ativa, ela eHZivaler profundidade do
aninhaento. As duas condies Hue deve vi1orar caso os parYnteses de ua e(presso fore u padro
adiss*vel so as se1uintes:
1. A conta1e de parYnteses no final da e(presso B. "sso iplica Hue nenhu escopo ficou aberto ou Hue foi
encontrada a esa Huantidade de parYnteses da direita e da esHuerda.
A. A conta1e de parYnteses e cada ponto na e(presso Y no!ne1ativa. "sso iplica Hue no foi encontrado u
parYntese da direita para o Hual no e(ista u correspondente parYntese da esHuerda.
2a -i1ura 1, a conta1e e cada ponto de cada ua das cinco strin1s anteriores dada iediataente abai(o desse
ponto. :oo apenas a prieira strin1 atende aos dois critrios anteriorente citados, ela a Jnica dentre as cinco
co u padro de parYnteses correto.
A1ora, altereos li1eiraente o problea e suponhaos a e(istYncia de trYs tipos diferentes de deliitadores de
escopo. )sses tipos so indicados por parYnteses #e$, colchetes KeL e chaves #_e`$. 4 finalizador de escopo deve ser
do eso tipo de seu iniciador. /endo assi, strin1s coo:
#A G 3L, K#A G 3L$, _A ! #3L` so invlidas.
a necessrio rastrear no soente Huantos escopos fora abertos coo tab seus tipos. )stas inforaes so
iportantes porHue, Huando u finalizador de escopo encontrado, precisaos conhecer o s*bolo co o Hual o
escopo foi aberto para asse1urar Hue ele seja corretaente fechado.
4a pilha pode ser usada para rastrear os tipos de escopos encontrados. /epre Hue u iniciador de escopo for
encontrado, ele ser epilhado. /epre Hue u finalizador de escopo for encontrado, a pilha ser e(ainada. /e a
pilha estiver vazia, o finalizador de escopo no ter u iniciador correspondente e a strin1 ser, conseHuenteente,
invlida. )ntretanto, se a pilha no estiver vazia, desepilhareos e verificareos se o ite desepilhar
corresponde ao finalizador de escopo. /e ocorrer ua coincidYncia, continuareos. :aso contrrio, a strin1 ser
invlida.
Ruando o final da strin1 for alcanado, a pilha dever estar vazia> caso contrrio, e(iste u ou ais escopos abertos
Hue ainda no fora fechados e a strin1 ser invlida. 8eja a se1uir o al1orito para esse procediento. A fi1ura 1
ostra o estado da pilha depois de ler parte da strin1
{x + (y -[a + b])*c-[(d + e)]} / (h- (j- (k- [l-n]))).
7 - ( ( X * ( ( X + Y ) / ( J - 3 ) ) + Y ) / ( 4 - 2.5 ) )
0 0 1 2 2 2 3 4 4 4 4 3 3 4 4 4 4 3 2 2 2 1 1 2 2 2 2 2 1 0
( ( A + B )
1 2 2 2 2 1
A + B (
0 0 0 1
) A + B ( - C
-1 -1 -1 -1 0 0 0
( A + B ) ) - ( C + D
1 1 1 1 0 -1 -1 0 0 0 0
-i1ura 1 :onta1e de parYnteses e vrios pontos de strin1s.
1B
/M E-EM#LO: IN%I-O< #OS%I-O E #RE%I-O
)sta seo e(ainar ua iportante aplicao Hue ilustra os diferentes tipos de pilhas e as diversas operaes e
funes definidas a partir delas. , e(eplo , e si eso, u relevante tIpico de ciYncia da coputao.
:onsidere a soa de A ais 3. "a1inaos a aplicao do operador bGb sobre os operandos A e 3, e escreveos a
soa coo A G 3. )ssa representao particular chaada infi(a. )(iste trYs notaes alternativas para
e(pressar a soa de A e 3 usando os s*bolos A, 3 e G. /o elas:
G A 3 2re&i8a
A G 3 in&i8a
A 3 G 2os&i8a
,s prefi(os bpreb, bposb e binb refere!se V posio relativa do operador e relao aos dois operandos. 2a notao
prefi(a, o operador precede os dois operandos> na notao posfi(a, o operador introduzido depois dos dois
operandos e, na notao infi(a, o operador aparece entre os dois operandos.
2a realidade, as notaes prefi(a e posfi(a no so to inccodas de usar coo possa parecer a princ*pio. 0or
e(eplo, ua funo e : para retornar a soa dos dois ar1uentos, A e 3, chaada por /oa#A, 3$. ,
operador /oa precede os operandos A e 3.
)(aineos a1ora al1uns e(eplos adicionais. A avaliao da e(presso A G 3 X :, confore escrita e notao
infi(a, reHuer o conheciento de Hual das duas operaes, G ou X, deve ser efetuada e prieiro lu1ar. 2o caso de G
e X, bsabeosb Hue a ultiplicao deve ser efetuada antes da adio #na ausYncia de parYnteses Hue indiHue o
contrrio$. /endo assi, interpretaos A G 3 X : coo A G #3 X :$, a enos Hue especificado de outra fora.
&izeos, ento, Hue a ultiplicao te precedYncia sobre a adio. /uponha Hue Hueiraos rescrever A G 3 X :
e notao posfi(a. Aplicando as re1ras da precedYncia, convertereos prieiro a parte da e(presso Hue avaliada
e prieiro lu1ar, ou seja a ultiplicao. -azendo essa converso e est1ios, obtereos:
A G #3 X :$ parYnteses para obter Ynfase
A G #3: X$ converte a ultiplicao
A #3: X$ G converte a adio
A3: X G fora posfi(a
As Jnicas re1ras a lebrar durante o processo de converso Hue as operaes co a precedYncia ais alta so
convertidas e prieiro lu1ar e Hue, depois de ua parte da e(presso ter sido convertida para posfi(a, ela deve ser
tratada coo u Jnico operando. )(aine o eso e(eplo co a precedYncia de operadores invertida pela
insero deliberada de parYnteses.
#A G 3$ X : fora infi(a
#A3 G$ X : converte a adio
#A3 G$ : X converte a ultiplicao
A3 G : X fora posfi(a
2esse e(eplo, a adio convertida antes da ultiplicao por causa dos parYnteses. Ao passar de #A G 3$ X :
para #A3 G$ X :, A e 3 so os operandos e G o operador. Ao passar de #A3 G$ X : para #A3 G$: X, #A.3 G$ e :
so os operandos e X o operador. As re1ras para converter da fora infi(a para a posfi(a so siples, desde Hue
vocY conhea as re1ras de precedYncia.
:onsideraos cinco operaes binrias: adio, subtrao, ultiplicao, diviso e e(ponenciao. As Huatro
prieiras esto dispon*veis e : e so indicadas pelos conhecidos operadores G, !, X e C.
A Huinta operao, e(ponenciao, representada pelo operador d. , valor da e(presso A d 3 A elevado V
potYncia de 3, de aneira Hue < d A 6. 8eja a se1uir a orde de precedYncia #da superior para a inferior$ para
esses operadores binrios:
e(ponenciao ultiplicaoCdiviso adioCsubtrao
11
Ruando operadores se parYnteses e da esa orde de precedYncia so avaliados, pressupe!se a orde da
esHuerda para a direita, e(ceto no caso da e(ponenciao, e Hue a orde supostaente da direita para a
esHuerda. /endo assi, A G 3 G : si1nifica #A G 3$ G :, enHuanto A d 3 d : si1nifica A d #3 d :$. 4sando
parYnteses, podeos i1norar a precedYncia padro.
4a Huesto iediataente Ibvia sobre a fora posfi(a de ua e(presso a ausYncia de parYnteses. )(aine as
duas e(presses, A G #3 X :$ e #A G 3$ X :. )bora os parYnteses e ua das e(presses seja suprfluos Kpor
conveno, A G 3 X : Q A G #3 X :$L, os parYnteses na se1unda e(presso so necessrios para evitar confuso co
a prieira.
As foras posfi(as dessas e(presses so:
Forma Infixa Forma osfixa
AG#3X:$ A3: XG
#AG3$X: A3G:X
:onsiderando a e(presso: a/b^c + d*e - a*c
,s operandos so: ,s operadores so:
, prieiro passo a saber Hual a orde de prioridade dos operadores:
,perador 0rioridade
d, #G e !$ unrio F
X,C 7
G,! N
\,e,\Q,eQ,e\ <
A2& A
,' 1
ApIs, basta utilizaros ua pilha para transforaros a e(presso
)(: AG3X: e A3:XG
)leento 0ilha /a*da
A ! A
G G A
3 G A3
X GX A3
: GX A3:
2o final, basta juntaros a sa*da ao Hue restou da pilha #desepilhando u a u$ V sa*da: A3: X G
2ote Hue e #1$ o operador X foi colocado na pilha sobre o operador G. "sso se deve ao fato de Hue a prioridade do X
aior do Hue a do G. /epre Hue a prioridade de u eleento a epilhar for aior do Hue a prioridade do Jltio
eleento da pilha, esse eleento dever ser epilhado.
Ruando a prioridade do eleento a epilhar for enor ou i1ual ao Jltio eleento Hue est na pilha, deve!se ento
adotar o se1uinte procediento: desepilhar eleentos at Hue fiHue coo Jltio eleento da pilha, al1u eleento
co prioridade enor do Hue o eleento Hue se est epilhando. :aso no houver na pilha nenhu eleento co
prioridade enor do Hue o eleento Hue se est epilhando, fica soente o eleento Hue se est epilhando. ,s
deais sae para a sa*da.
d fica
X fica fica C X
G ! G ! X ! X ! !
)ntra: G )ntra: ! )ntra: X
/ae: X! /ai: X /ae: d C
#1$
1A
E8erc9cios:
%ransfore as se1uintes e(presses para a fora posfi(a:
a$ A/B^C+D*E-A*C
b$ A*(B+C*A-D)*D
c$ X+(A*(B+C*A-D)*D)-2-F
#ro:"e1a 2ro2osto envo"veno 2i"$a
LE-SIN ! Ava"iaor L08ico e Sint@tico e E82ress7es ,"e8sin3c22.
4a das foras ais interessantes do uso de pilhas a na avaliao de ua e(presso atetica. 0ode!se, atravs
da pilha, fazer a anlise l(ica de ua e(presso #indicar se ua e(presso possui u operando invlido, coo por
e(eplo u s*bolo HualHuer Hue no est presente ne na tabela de operadores, ne na tabela de operandos$ e
tab a anlise sinttica. A anlise sinttica pode indicar Hue est faltando u ou ais parYnteses, sobrando u
ou ais parYnteses, sobrando operador, A operandos sucessivos, etc. A tarefa aHui deterinar se ua e(presso
est correta ou no.
)ntrada
:oo entrada, so vlidos:
a$ ,perandos: todas as letras aiJsculas ou inJsculas #ab... ...(z, A3... ...[E$ e nJeros #B1..6$.
b$ 0arYnteses.
c$ ,peradores: devero ser aceitos os se1uintes operadores se1undo a tabela de prioridades apresentada abai(o:
Operador Prioridade
^
F
*,/
7
+,-
N
>,<,=,#,
<
AND ( . )
A
OR ( | )
1
0ara facilitar a ipleentao, pode!se utilizar u ponto coo A2& #.$ e o 0ipe # f $ coo ,'.
,bs.: :oo restrio, no ser peritida a entrada de e(presses co operadores unrios. )(eplo: N X !A
A finalizao da entrada ser deterinada pelo final do arHuivo de entrada ),-#$.
/a*da
:oo sa*da, para cada e(presso de entrada dever ser 1erado ua linha indicando o resultado do processaento.
/e a e(presso estiver correta, esta dever ser transforada para a fora infi(a. /e no for poss*vel, deve ser
apresentadas ensa1ens indicando: ,perando "nvlido ou )rro de sinta(e, nesta orde.
)(eplo de entrada
#
#AG
#AG3$Xc
#AG3$Xg
#aGbXc$CAXeGa
#aGbXc$CAX#eGa$
#aGbXc$CAX#eGa
#abGXc$CAX#eGa$
#aGbXcc$CAX#eGa
#SaGbXcc$CAX#eGa
)(eplo de sa*da
)rro de /inta(eW
)rro de /inta(eW
A3GcX
)rro .(icoW
abcXGACeXaG
abcXGACeaGX
)rro de /inta(eW
)rro de /inta(eW
)rro de /inta(eW
)rro .(icoW
1<
In9cio a so"u'(o
Al1uns passos deve ser considerados aHui para a resoluo do problea:
.eia o 0roblea cuidadosaente: leia cada linha do problea cuidadosaente. ApIs desenvolver a soluo,
leia atentaente a descrio do erro. :onfira atentaente as entradas e sa*das do problea.
2o pressuponha entradas: sepre h u conjunto de entradas para e(eplo de u problea. 0ara testar,
deve!se utilizar ais casos para entrada, nJeros ne1ativos, nJeros lon1os, nJeros fracionrios, strin1s
lon1as. %oda entrada Hue no for e(plicitaente proibida peritida. &eve se cuidar a orde de entrada
tab, pois Huando pede!se por e(eplo para verificar u intervalo entre A nJeros, estes A nJeros
pode estar e orde crescente ou decrescente e assi por diante.
2o se apressar: ne sepre a eficiYncia fundaental, portanto no deve!se preocupar co isso a enos
Hue isso seja u predicado do problea. &eve!se ler a especificao para aprender o (io poss*vel sobre
o taanho da entrada e decidir Hual al1orito pode resolver o problea para aHuela deterinada entrada de
dados. 2este caso espec*fico a eficiYncia no precisa ser ua 1rande preocupao.
Su)est(o 2ara i12"e1enta'(o
)(iste uitas aneiras diferentes para verificar a prioridade de u eleento no trabalho de ipleentao. 4a
su1esto seria criar ua estrutura co A vetores ).)MK1BL e 0'"K1BL. 0rocura!se inicialente o operador no vetor
).)M. Ao encontr!lo, pe1a!se a prioridade na esa posio do vetor 0'". )(eplos:
!otina para testar prioridade
#include <iostream>
#include <string>
using namespace std;
int main(void){
string operador;
string expr = "|.><=#+-*/^";
const int prior[11]= {1,2,3,3,3,3,4,4,5,5,6};
int prioridade=-1;
cin >> operador;
for (int i=0; i<=10; i++) {
if (expr.substr(i,1)==operador)
prioridade = prior[i];
}
cout << prioridade;
return (0);
}
"perando.cpp # $este para ver se % &m operando # '(etras mai)sc&las* min)sc&las e n)meros+
,,"-s. esta rotina deve ser usada em conjunto com a rotina prioridade. Inicialmente, faz a leitura da expresso.
Por exemplo a/-0c1. Faz-se ento a verificao de cada caracter da entrada individualmente. O a, por
exemplo, um operando v!lido. "nto ele deve ir direto para a sa#da. $o caso do /, %ue o se&undo elemento
da entrada, a rotina retorna %ue no um operando v!lido. "nto, deve-se pass!-lo como par'metro da rotina
prioridade para verificar se o mesmo um operador. "m caso afirmativo, deve-se proceder com o
empil(amento ou desempil(amento do mesmo, conforme o caso. )o testar um caracter inv!lido, por exemplo o
1, inicialmente verifica-se %ue no um operando v!lido *rotina operando+. "m se&uida verifica-se tam,m
%ue no um operador v!lido *rotina prioridade+. $este caso, o soft-are deve retornar um erro
operando.operador inv!lido/
#include <iostream>
#include <string>
using namespace std;
int main(void){
const string VALIDOS (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789);
string entrada;
cin >> entrada; //getline (cin,entrada) para o caso de permitir espaos em branco
for (int i=0; i < entrada.length(); i++) {
if (VALIDOS.find(entrada[i],0) != -1)
cout << entrada[i] << um operando vlido;
else
cout << entrada[i] << no operando vlido: (operador, parnteses ou erro)!;
}
return (0);
}
1N
;353 %ILA ,E/E/E.
-ilas ant a orde #first in, first out$. 4 baralho co cartas pode ser odelado coo ua fila, se retiraros as
cartas e cia e colocaros as carta de volta por bai(o. ,utro e(eplo seria a fila de u banco. As operaes de
insero so efetuadas no final e as operaes de retirada so efetuadas no in*cio. A insero de u eleento torna!o
Jltio da lista #fila$.
As operaes abstratas e ua fila inclue:
)nHueue#(,H$: insere o ite ( no fi da fila H.
&eHueue#H$: retorna e reove o ite do topo da fila H.
"nicialize#H$: cria ua fila H vazia.
-ull#H$, )ptD#H$: testa a fila para saber se ela est cheia ou vazia.
-ilas so ais dif*ceis de ipleentar do Hue pilhas, porHue as aes ocorre e abas as e(treidades. A
ipleentao ais siples usa u vetor, inserindo novos eleentos e ua e(treidade e retirando de outra e
depois de ua retirada ovendo todos os eleentos ua posio para a esHuerda. 3e, pode!se fazer elhor
utilizando os *ndices &irst ,frente$ e "ast #re$ ao invs de fazer toda a ovientao. Ao se usar estes *ndices, fica
ua rea no usada no in*cio da estrutura. "sso pode ser resolvido atravs de ua fila circular, onde apIs a insero
na Jltia posio, inicia!se novaente a insero pelo in*cio da fila, se tiver posio dispon*vel, claro.
&essa fora, tereos a se1uinte estrutura:
typedef struct {
int q[SIZE+1];
int first;
int last;
int count;
} queue;
queue q;
4a fila co 7 eleentos, se nenhu deles ter sido retirado apresentada abai(o:
fila.dados: A - : h 3
Hueue.first Hueue.last
2seuo!a")orit1o e inser'(o e u1a &i"a:
void insere_fila (valor) {
se fila->count > SIZE ento
OVERFLOW();
seno
fila.last++;
fila.dados[fila.last]=valor;
fila.count++;
fim_se
}
2seuo!a")orit1o e retiraa e u1a &i"a:
int retra_fila (void) {
se fila.count <= 0 ento
UNDERFLOW();
seno
char x = fila.dados[fila.first];
fila.first++;
fila.count--;
retornar(x);
fim_se
}
/* Queue.cpp. Baseado no algoritmo queue.c do livro
do Steven Skiena (2002) e atualizado por Neilor Tonin
em 03/01/2008.
Implementation of a FIFO queue abstract data type.
*/
17
#include <iostream>
#include "queue.h"
#define TRUE 1
#define FALSE 0
#define SIZE 3 //red <.
using namespace std;
void init_queue(queue *q){
q->first = 0;
q->last = SIZE-1;
q->count = 0;
}
void enqueue(queue *q, int x){
if (q->count >= SIZE)
cout << "Warning: overflow na fila ao inserir!" << x << endl;
else {
q->last = (q->last+1) % SIZE;
q->q[ q->last ] = x;
q->count = q->count + 1;
}
}
int dequeue(queue *q){
int x;
if (q->count <= 0)
cout << "Warning: underflow na fila ao retirar!" << endl;
else {
x = q->q[ q->first ];
q->first = (q->first+1) % SIZE;
q->count = q->count - 1;
}
return(x);
}
int empty(queue *q){
if (q->count <= 0) return (TRUE);
else return (FALSE);
}
void print_queue(queue *q){
int i,j;
i=q->first;
cout <<endl<< "Elementos da fila:" << endl;
(hile (i != q->last) {
cout << q->q[i] << endl;
i = (i+1) % SIZE;
}
cout << q->q[i] << endl;
}
int main(void){
queue *q;
init_queue(q);
enqueue(q,12);
enqueue(q,4);
enqueue(q,32);
print_queue(q);
dequeue(q);
enqueue(q,2);
print_queue(q);
dequeue(q);
print_queue(q);
return(0);
}
<.A.1 )(eplo de u projeto utilizando fila: hoin1 to iar
2o jo1o de cartas infantil Shoin1 to iarT, 7A cartas so distribu*das para A jo1adores #1 e A$ de odo Hue cada u
fica co AF cartas. 2enhu jo1ador pode olhar as cartas, as deve antY!las co a face para bai(o. , objetivo do
jo1o recolher #1anhar$ todas as 7A cartas.
Abos jo1adores jo1a a virando a carta de cia do seu onte e colocando!a na esa. A ais alta das duas vence e
o vencedor recolhe as duas cartas colocando!as ebai(o de seu onte. , ran5 das cartas o se1uinte, da aior para
a enor: A,=,R,9,%,6,M,O,F,7,N,<,A. 2aipes so i1noradas. , processo repetido at Hue u dos dois jo1adores no
tenha ais cartas.
#define SIZE 10
typedef struct {
int q[SIZE+1]; /* body of queue */
int first; /* position of first element */
int last; /* position of last element */
int count; /* number of queue elements */
} queue;
1F
Ruando a carta virada dos dois jo1adores te o eso valor acontece ento a 1uerra. )stas cartas fica na esa e
cada jo1ador jo1a ais duas cartas. A prieira co a face para bai(o, e a se1unda co a face para cia. A carta
virada co a face para cia Hue for aior vence, e o jo1ador Hue a jo1ou leva as F cartas Hue esto na esa. /e as
cartas co a face para cia de abos os jo1adores tivere o eso valor, a 1uerra continua e cada jo1ador volta a
jo1ar ua carta co a face para bai(o e outra co a face para cia.
/e al1u dos jo1adores fica se cartas no eio da 1uerra, o outro jo1ador autoaticaente vence. As cartas so
adicionadas de volta para os jo1adores na orde e(ata Hue elas fora distribu*das, ou seja a prieira carta prIpria
#jo1ada pelo prIprio jo1ador$, a prieira carta do oponente, a se1unda carta prIpria, a se1unda carta jo1ada pelo
oponente e assi por diante...
:oo HualHuer criana de 7 anos, sabe!se Hue o jo1o de 1uerra pode levar u lon1o tepo para terinar. Mas
Huanto lon1o este tepo] , trabalho aHui escrever u pro1raa para siular o jo1o e reportar o nuero de
ovientos.
Constru'(o o 1onte e cartas
Rual a elhor estrutura de dados para representar u onte de cartas] A resposta depende do Hue se Huer fazer co
elas. )st se tentando ebaralh!las] :oparar seus valores] 0esHuisar por u padro na pilha. As intenes Hue
vo definir as operaes na estrutura de dados.
A prieira ao Hue necessitaos fazer dar as cartas do topo e adicionar outras na parte de bai(o do onte.
0ortanto, natural Hue cada jo1ador utilize ua fila #estrutura -"-,$ definida anteriorente.
Mas aHui tY!se u problea fundaental. :oo representar cada carta] %Y!se as naipes #0aus, :opas, )spada e
,uro$ e valores na orde crescente #A!1B, valete, rainha, rei e js$. %Y!se diversas escolhas poss*veis. 0ode!se
representar cada carta por u par de caracteres ou nJeros especificando a naipe e valor. 2o problea da
h4)''A, pode!se i1norar as naipes k as tal pensaento pode trazer u problea. :oo saber Hue a
ipleentao da -ila est funcionando perfeitaente]
A prieira operao na h4)''A coparar o valor da face das cartas. "sso coplicado de fazer co o prieiro
caracter da representao, porHue deve!se coparar de acordo co o ordenaento histIrico dos valores da face.
4a lI1ica Uad Uoc parece necessria para se lidar co este problea. :ada carta dever ter u valor de B a 1<.
,rdena!se os valores das cartas do enor ao aior, e nota!se Hue h N cartas distintas de cada valor. Multiplicao e
diviso so a chave para apeaento de B at 71.
#include <iostream>
#include <cmath>
#include <cstdlib>
#include "queue2.h" //Biblioteca com a estrutura da fila e suas funes
#define NCARDS 52 //cartas
#define NSUITS 4 //Naipes
#define TRUE 1
#define FALSE 0
#define MAXSTEPS 100000 //Define o nmero mximo de jogadas
using namespace std;
char values[] = "23456789TJQKA";
char suits[] = "pceo"; // (p)aus (c)opas (e)spadas e (o)uros
char value(int card){
return( values[card/NSUITS] );
}
void print_card_queue(queue *q) {
int i=q->first,j;
(hile (i != q->last) {
cout << value(q->q[i])<< suits[q->q[i] % NSUITS];
i = (i+1) % QUEUESIZE;
}
cout << value(q->q[i]) << suits[q->q[i] % NSUITS];
}
void clear_queue(queue *a, queue *b){
(hile (!empty(a))
enqueue(b,dequeue(a));
}
1O
void embaralha (int perm[NCARDS+1]){
randomize();
int a,b,i,aux;
for (i = 0; i <=20; i++){
a= rand()%52;
b= rand()%52;
aux = perm[a];
perm[a]=perm[b];
perm[b]=aux;
}
}
void random_init_decks(queue *a, queue *b){
int i; // counter
int perm[NCARDS+1];
for (i=0; i<NCARDS; i=i+1) {
perm[i] = i;
}
embaralha(perm);
init_queue(a);
init_queue(b);
for (i=0; i<NCARDS/2; i=i+1) {
enqueue(a,perm[2*i]);
enqueue(b,perm[2*i+1]);
}
//cout << endl << "CARTAS: " << endl;
//print_card_queue(a);
//cout << endl << "CARTAS: " << endl;
//print_card_queue(b);
}
void war(queue *a, queue *b) {
int steps=0; /* step counter */
int x,y; /* top cards */
queue c; /* cards involved in the war */
)ool inwar; /* are we involved in a war? */
inwar = FALSE;
init_queue(&c);
(hile ((!empty(a)) && (!empty(b) && (steps < MAXSTEPS))) {
print_card_queue(a);
cout << endl;
print_card_queue(b);
cout << endl << endl;
steps = steps + 1;
x = dequeue(a);
y = dequeue(b);
// x e y possuem valores de 0 at 51
cout << x <<":"<< value(x) <<suits[x%NSUITS] <<" "<<y<<":"<<value(y)<< suits[y%NSUITS] << endl;
enqueue(&c,x);
enqueue(&c,y);
if (inwar) {
inwar = FALSE;
} else {
if (value(x) > value(y))
clear_queue(&c,a);
else if (value(x) < value(y))
clear_queue(&c,b);
else if (value(y) == value(x))
inwar = TRUE;
}
}
cout << "Cartas nas pilhas A: " << a->count << " B: " << b->count << endl;
if (!empty(a) && empty(b))
cout << "a venceu em " << steps << " jogadas " << endl;
else if (empty(a) && !empty(b))
cout << "b venceu em " << steps << " jogadas " << endl;
else if (!empty(a) && !empty(b))
cout << "jogo empatado apos " << steps << " jogadas" << endl;
else
cout << "jogo empatado apos " << steps << " jogadas" << endl;
}
int main(){
queue a,b;
int i;
random_init_decks(&a,&b);
war(&a,&b);
return(0);
`
0robleas #e(erc*cios$ copleentares 4FF;G< 1B<17, 4FFHF< MN<, 1BAB7, 1BBNN, 1BA7M ,2@)inas I5 at0 HI. !
livro /teven /5iena e Mi1uel 'evilla #http:CCicpcres.ecs.baDlor.eduConlinejud1eC $
1M
I3 C"assi&ica'(o ,orena'(o. e aos
:lassificar o processo de ordenar os eleentos pertencente a ua estrutura de dados e eIria #vetor$ ou e
disco #re1istros de ua tabela de dados$ e orde ascendente ou descendentes.
,s fatores Hue influe na eficcia de u al1orito de classificao so os se1uintes:
o nJero de re1istros a sere classificados>
se todos os re1istros cabero ou no na eIria interna dispon*vel>
o 1rau de classificao j e(istente>
fora coo o al1orito ir ordenar os dados>
I34 Bu::"esort
0or ser siples e de entendiento e ipleentao fceis, o 3ubblesort #bolha$ est entre os ais conhecidos e
difundidos todos de ordenao de arranjos. Mas no se trata de u al1orito eficiente, estudado para fins de
desenvolviento de racioc*nio.
, princ*pio do 3ubblesort a troca de valores entre posies consecutivas, fazendo co Hue os valores ais altos
# ou ais bai(os $ bborbulheb para o final do arranjo #da* o noe 3ubblesort$. 8eja o e(eplo a se1uir:
2esta ilustrao vaos ordenar o arranjo e orde crescente de valores. :onsidereos inicialente u arranjo
HualHuer desordenado. , prieiro passo se fazer a coparao entre os dois eleentos das prieiras posies :

Assi verificaos Hue neste caso os dois prieiros eleentos esto desordenados entre si, lo1o deveos troc!los de
posio. ) assi continuaos co as coparaes dos eleentos subseHuentes :
AHui, ais ua vez, verificaos Hue os eleentos esto desordenados entre si. &eveos fazer a troca e continuar
nossas coparaes at o final do arranjo :
0ode!se dizer Hue o nJero 7 bborbulhoub para a sua posio correta, l no final do arranjo. , prI(io passo a1ora
ser repetir o processo de coparaes e trocas desdo in*cio do arranjo. /I Hue dessa vez o processo no precisar
coparar o penJltio co o Jltio eleento, pois o Jltio nJero, o 7, est e sua posio correta no arranjo.
long int aux; // Varivel auxiliar para fazer a troca, caso necessrio
for ( long int i=0; i <= tam-2; i++ ){
for ( long int j=0; j<= tam-2-i; j++ ) {
if ( Array[j] > Array[j+1] ) { // Caso o elemento de uma posio menor
aux = Array[j]; // for maior que um elemento de uma posio
Array[j] = Array[j+1]; // maior, faz a troca.
Array[j+1] = aux;
}
}
}
16
I35 Se"e'(o Direta
:onsiste e encontrar a enor chave por pesHuisa seHuencial. )ncontrando a enor chave, essa perutada co a
Hue ocupa a posio inicial do vetor, Hue fica ento reduzido a u eleento.
, processo repetido para o restante do vetor, sucessivaente, at Hue todas as chaves tenha sido selecionadas e
colocadas e suas posies definitivas.
4a outra variao deste todo consiste e posicionar!se no prieiro eleento e a* ir testando!o co todos os
outros #se1undo$... #Jltio$, trocando cada vez Hue for encontrado u eleento enor do Hue o Hue est na prieira
posio. ) se1uida passa!se para a se1unda posio do vetor repetindo novaente todo o processo. )(:
...
)(erc*cio: considerando o vetor:
6 A7 1B 1M 7 O 17 <
,rdene!o pelo todo de seleo direta:
I3; Inser'(o Direta
, todo de ordenao por "nsero &ireta o ais rpido entre os outros todos considerados bsicos k
3ubblesort e /eleo &ireta. A principal caracter*stica deste todo consiste e ordenaros o arranjo utilizando u
sub!arranjo ordenado localizado e seu inicio, e a cada novo passo, acrescentaos a este sub!arranjo ais u
eleento, at Hue atin1ios o Jltio eleento do arranjo fazendo assi co Hue ele se torne ordenado. 'ealente
este u todo dif*cil de se descrever, ento vaos passar lo1o ao e(eplo.
:onsidereos inicialente u arranjo HualHuer desordenado:
"nicialente consideraos o prieiro eleento do arranjo coo se ele estivesse ordenado, ele ser considerado o o
sub!arranjo ordenado inicial :
AB
A1ora o eleento iediataente superior ao o sub!arranjo ordenado, no o e(eplo o nJero <, deve se copiado
para ua varivel au(iliar HualHuer. ApIs copi!lo, deveos percorrer o sub!arranjo a partir do Jltio eleento
para o prieiro. Assi podereos encontrar a posio correta da nossa varivel au(iliar dentro do sub!arranjo :
2o caso verificaos Hue a varivel au(iliar enor Hue o Jltio eleento do o sub!arranjo ordenado # o o sub!
arranjo sI possui por enHuanto u eleento, o nJero 7 $. , nJero 7 deve ento ser copiado ua posio para a
direita para Hue a varivel au(iliar co o nJero <, seja colocada e sua posio correta :
8erifiHue Hue o sub!arranjo ordenado possui a1ora dois eleentos. 8aos repetir o processo anterior para Hue se
continue a ordenao. :opiaos ento ais ua vez o eleento iediataente superior ao o sub!arranjo ordenado
para ua varivel au(iliar. .o1o e se1uida vaos coparando nossa varivel au(iliar co os eleentos do sub!
arranjo, sepre a partir do Jltio eleento para o prieiro :
2este caso verificaos Hue a nossa varivel au(iliar enor Hue o Jltio eleento do sub!arranjo. Assi,
copiaos este eleento para a direita e continuaos co nossas coparaes :
AHui, ais ua vez a nossa varivel au(iliar enor Hue o eleento do sub!arranjo Hue estaos coparando. 0or
isso ele deve ser copiado para a direita, abrindo espao para Hue a varivel au(iliar seja colocada e sua posio
correta :
8erifiHue Hue a1ora o sub!arranjo ordenado possui < eleentos. :ontinua!se o processo de ordenao copiando ais
ua vez o eleento iediataente superior ao o sub!arranjo para a varivel au(iliar. .o1o e se1uida vaos
coparar essa varivel au(iliar co os eleentos do o sub!arranjo a partir do Jltio eleento :
8eja Hue nossa varivel au(iliar enor Hue o eleento Hue est sendo coparado no o sub!arranjo. )nto ele deve
ser copiado para a direita para Hue continueos co nossas coparaes :
A1
8eja Hue aHui ocorre o inverso. A varivel au(iliar aior Hue o eleento do sub!arranjo Hue estaos coparando.
"sto si1nifica Hue j encontraos a posio correta para a nossa varivel au(iliar.
3asta a1ora copi!la para sua posio correta, ou seja, copi!la para o eleento iediataente superior ao eleento
Hue estava sendo coparado, veja :
o sub!arranjo ordenado possui a1ora Huatro eleentos. 'epete!se ais ua vez o processo todo de ordenao,
copiando o eleento iediataente superior ao o sub!arranjo para ua varivel au(iliar. A* copara!se essa
varivel au(iliar co os eleentos do o sub!arranjo, lebrando!se Hue a orde do Jltio eleento para o
prieiro. :aso seja necessrio, copia!se para a direita os eleentos Hue fore aiores Hue a varivel au(iliar at
Hue se encontre u eleento enor ou at Hue se che1ue ao in*cio do arranjo. a siples:
AHui encontraos u eleento enor Hue a varivel au(iliar. "sto si1nifica Hue encontraos sua posio correta
dentro do sub!arranjo. 3asta a1ora copi!la para a posio correta :
)(erc*cio: considerando o vetor:
6 A7 1B 1M 7 O 17 <
,rdene!o:
AA
I3I #ente ,Co1:Sort.:
)ste todo de classificao ipleenta saltos aiores Hue 1 casa por vez. /uponhaos coo e(eplo o
vetor de chaves abai(o. :oo o vetor possui 7 chaves, o salto inicial i1ual a <. ,3/.: o salto dado pelo
valor h Q n C 1,< /alto Q "nt# n C 1,<$ Q < Ruando terinar o procediento co salto Q 1 ento
utilizado o al1orito 3,.UA para terinar de ordenar
8ar. iter.. vetor salto par coparado ao
1 1 5G AF <B 5I A7 < troca
A AN 5J <B AM 5H < troca
< 5I A7 ;F AM AF A no troca
A N AN 5H <B 5G AF A no troca
7 AN A7 ;F AM 5J A troca
F
5I 5H AF AM <B
1 no troca
< O AN 5H 5J AM <B 1 no troca
M AN
AN
A7
A7
5J
AF
5G
5G
<B
;F
1
1
no troca
no troca
I3H S$e""sort
, al1orito de ordenao por shel foi criado por &onald .. /hell e 1676. 2este al1orito, ao invs dos dados
sere coparados co os seus vizinhos, criado u gap. , gap, no in*cio, i1ual V parte inteira da diviso do
nJero de eleentos da lista por A. 0or e(eplo, se a nossa lista te 17 eleentos, o gap inicial i1ual a O. /o
ento coparados os eleentos 1
o
. e M
o
., A
o
. e 6
o
., e assi por diante.
, Hue acontece, ento] A aior parte dos eleentos j vo para suas posies apro(iadas. , 17, por e(eplo, j
andado para o fi da lista na prieira passa1e, ao contrrio do Hue acontece na ordeno de troca.
Ao terinar de passar por todos os eleentos da lista, o gap dividido por A e feita ua nova passa1e. "sso
repetido at Hue o gap seja i1ual a B.
8aos observar a1ora todos os passos realizados pelo al1orito para os valores abai(o:
*+ !!+ ,+ "+ -+ .+ !+ /+ #+ 0+ .+
5:
5| 11| 4| 2| 8| 7| 1| 6| 3| 9| 5|
5| 11| 4| 2| 8| 5| 1| 6| 3| 9| 7|
5| 1| 4| 2| 8| 5| 11| 6| 3| 9| 7|
5| 1| 4| 2| 8| 5| 11| 6| 3| 9| 7|
5| 1| 4| 2| 8| 5| 11| 6| 3| 9| 7|
5| 1| 4| 2| 8| 5| 11| 6| 3| 9| 7|
2:
5| 1| 4| 2| 8| 5| 11| 6| 3| 9| 7|
4| 1| 5| 2| 8| 5| 11| 6| 3| 9| 7|
4| 1| 5| 2| 8| 5| 11| 6| 3| 9| 7|
4| 1| 5| 2| 8| 5| 11| 6| 3| 9| 7|
3| 1| 4| 2| 5| 5| 8| 6| 11| 9| 7|
3| 1| 4| 2| 5| 5| 7| 6| 8| 9| 11|
3| 1| 4| 2| 5| 5| 7| 6| 8| 9| 11|
3| 1| 4| 2| 5| 5| 7| 6| 8| 9| 11|
3| 1| 4| 2| 5| 5| 7| 6| 8| 9| 11|
3| 1| 4| 2| 5| 5| 7| 6| 8| 9| 11|
1:
1| 3| 4| 2| 5| 5| 7| 6| 8| 9| 11|
1| 3| 4| 2| 5| 5| 7| 6| 8| 9| 11|
1| 2| 3| 4| 5| 5| 7| 6| 8| 9| 11|
1| 2| 3| 4| 5| 5| 7| 6| 8| 9| 11|
1| 2| 3| 4| 5| 5| 7| 6| 8| 9| 11|
1| 2| 3| 4| 5| 5| 7| 6| 8| 9| 11|
1| 2| 3| 4| 5| 5| 6| 7| 8| 9| 11|
1| 2| 3| 4| 5| 5| 6| 7| 8| 9| 11|
1| 2| 3| 4| 5| 5| 6| 7| 8| 9| 11|
1| 2| 3| 4| 5| 5| 6| 7| 8| 9| 11|
A<
I3J Mer)esort
A idia principal deste al1orito cobinar duas listas j ordenadas. , al1orito Huebra u arraD ori1inal e dois
outros de taanhos enor recursivaente at obter arraDs de taanho 1, depois retorna da recurso cobinando os
resultados. :ada u dos dois se1entos possui u ponteiro #( e D$ Hue increentado ao se selecionar o valor
4 dos principais probleas co o Mer1e/ort Hue ele faz uso de u arraD au(iliar. A fi1ura abai(o ilustra a ao
do Mer1e/ort.
)(eplo:
A< 1O M 17 6 1A 16 O N
1O A< M 17 6 1A O 16 N
( D ( D
I3K EuicLsort
)ste todo de classificao foi inventado por Uoare KU,AFAL e seu desepenho o elhor na aioria das vezes.
, prieiro eleento da lista a ser classificada escolhido coo o pivc. &epois da prieira fase da classificao, o
pivc ocupa a posio Hue ocupar Huando a lista estiver copletaente classificada. ,s re1istros co valores de
chaves enores do Hue o valor de chave do re1istro pivc o precede na lista e os re1istros co valores de chaves
aiores do Hue o valor de chave do re1istro pivc o sucede na lista.
:ada re1istro coparado co o re1istro pivc e suas posies so perutadas se o valor de chave do re1istro for
aior e o re1istro preceder o re1istro pivc, ou se o valor de chave do re1istro for enor e o re1istro suceder o
re1istro pivc. A posio do re1istro pivc no final de ua fase divide a lista ori1inal e duas sublistas #parties$,
cada ua delas precisando ser ordenada.
E-EM#LO:
"nicialente, pe1a!se u vetor inicial e particiona!se da se1uinte fora:
8etor particionado:
/1 /A /<
n
1
5
5G1
n
1
5!1
AN
Su2on$a1os o vetor a:ai8o:
6 A7 1B 1M 7 O 17 <
escolheos a chave 6 coo particionadora e a 1uardaos e ua varivel c2. :o isso, a posio ocupada por ela
se torna dispon*vel para ser ocupada por outra chave. )ssa situao indicada pelo s*bolo:

A7 1B 1M 7 O 17 < c2Q6
a partir da*, considereos A ponteiros #i: in*cio e &: fi$
9
A7 1B 1M 7 O 17 < esAuera

< A7 1B 1M 7 O 17
9
ireita

<
9
1B 1M 7 O 17 A7 esAuera

<
9
1B 1M 7 O 17 A7 esAuera

<
7 1B 1M 7
9
17 A7 esAuera

< O
9
1M 7 1B 17 A7 esAuera

< O 7 1M 9
1B 17 A7 ireita

< O 7
9
1M 1B 17 A7
observe ento Hue ebora os se1entos /1 e /< no esteja ainda ordenados, a chave particionadora se encontra na
sua posio definitivaente correta.
A seHZYncia a se1uir e(ibe apenas o final de cada processo de particionaento. As chaves particionadas so
ostradas e tipo ne)rito, enHuanto os se1entos de apenas u eleento Hue se forare so ostrados e tipo
itlico.

; O 7 M 17 1B 4G 25
; 5 K M 10 4H 4G 5H

i f
f i
i f
i
i
f
f
i f
i f
i f
A7
E8erc9cios si12"es
,rdene, atravs de todos os todos aprendidos, os eleentos: O, 11, N, A, M, 7, 1, F, <, 6, 1B

/eleo direta:
"nsero direta:
0ente #cobosort$:
/hellsort
Ruic5sort

AF
#ro:"e1as 2ro2ostos envo"veno c"assi&ica'(o ,Orena'(o.
,s probleas apresentados a se1uir fora retirados do livro 0ro1rain1 :hallen1es de / /5iena e M 'evilla. /o
probleas de classificao Hue pode utilizar estruturas vistas anteriorente para a sua soluo #pilhas, filas, etc$.
StaLs o& %"a2NacLs ,#i"$as e #anAuecas. 0:C48A 11BNBAC45F

0ilhas e filas so freHuenteente utilizadas e anlise de sinta(e, arHuitetura, sisteas operacionais, e siulao de
eventos. 0ilhas tab so iportantes na teoria de lin1ua1ens forais. )ste problea envolve al1uns destes
conceitos de pilhas e filas aplicados a u todo de virar panHuecas, de acordo co u conjunto de re1ras.
&ada ua pilha de panHuecas, deve!se escrever u pro1raa Hue indica coo a pilha pode ser classificado de odo
Hue a aior panHueca fiHue no fundo e a enor panHueca fiHue no topo. , taanho de ua panHueca dado pelo
di+etro da panHueca. Toas as 2anAuecas e1 u1a 2i"$a tD1 i&erentes iO1etros.
, ordenaento de ua pilha feito por ua seHZYncia de viradas #flips$ nas panHuecas. 4a virada consiste e
inserir ua esptula entre duas panHuecas e ua pilha e lanar #reverter$ todas panHuecas Hue esto acia da
esptula #inverso da sub!pilha$. 4a virada especificada dando a posio da panHueca do fundo da sub!pilha a
ser virada #co relao a toda a pilha$. A panHueca do fundo da pilha te posio 1 e a do topo te posio n.
4a pilha especificada dando o di+etro de cada panHueca na pilha na orde e Hue aparece as panHuecas. 0or
e(eplo, considere os trYs pilhas de panHuecas abai(o #no Hual a panHueca O a ais alta da pilha de panHuecas$:
7 8 2
4 6 5
6 4 7
8 7 4
5 5 6
2 2 8
A pilha V esHuerda pode ser transforada para a pilha no eio via flip #<$. A pilha do eio pode ser transforada
na pilha da direita atravs do coando flip #1$, ou seja < 1 B.
Entraa
A entrada consiste de ua seHZYncia de pilhas de panHuecas. :ada pilha ser coposto de entre 1 e <B panHuecas e
cada panHueca ter u di+etro inteiro entre 1 e 1BB. A entrada terinada por end!of!file. :ada pilha dada coo
ua Jnica linha de entrada co a panHueca do topo aparecendo por prieiro na linha, e a panHueca do fundo
aparecendo por Jltio, sendo Hue todas as panHuecas so separadas por u espao.
Sa9a
0ara cada pilha de panHuecas, a sa*da deve repetir a pilha ori1inal e ua linha, se1uido por al1uas seHZYncias de
&"i2s Hue resulta no ordenaento da pilha de panHuecas sendo Hue a panHueca de aior di+etro fica no fundo e a
panHueca de enor di+etro fica no topo. 0ara cada pilha a seHZYncia de viradas ,&"i2s. deve ser encerrado por u B
#indicando Hue nenhu &"i2 ais necessrio$. 4a vez Hue a pilha est classificada, nenhu &"i2 ais necessrio.
/aple "put
1 2 3 4 5
5 4 3 2 1
5 1 2 3 4
13
1 3
3 1
2 7 6 3
71 4 12 9 6 5 3 21 121 63 2 8 7
/aple ,utput CC )(plicao k no faz parte da sa*da
1 2 3 4 5 //Repetio da entrada
0 //Nenhum flip necessrio
5 4 3 2 1 //Repetio da entrada
1 0 //Flip na 1 panqueca. Aps, nenhum flip necessrio
5 1 2 3 4 //Repetio da entrada
1 2 0 //Flip 1, flip 2, Nenhum mais necessrio.
13
0
1 3
0
3 1
1 0
2 7 6 3
3 1 3 2 0
71 4 12 9 6 5 3 21 121 63 2 8 7
5 1 9 2 4 9 5 10 6 11 7 9 11 12 0
AO
S$e""Sort 0:C48A 11BNBOC4F4H5
S)le fez cada ua das tartaru1as ficar e cia da outra, acuulando todas elas e ua pilha co 6 tartaru1as e,
e se1uida, @ertle subiu. )le sentou e cia da pilha. Rue vista aravilhosaW )le pcde ver bais ua ilhaWT
, rei @ertle pretende reor1anizar seu trono de tartaru1as colocando os nobres e assessores prI(ios ao topo. 4a
Jnica operao est dispon*vel para alterar a orde das tartaru1as na pilha: ua tartaru1a pode sair fora de sua
posio na pilha e subir ao lon1o de outras tartaru1as e sentar!se no topo.
%endo e conta a pilha de tartaru1as e sua disposio ori1inal e ua disposio e(i1ida para esta esa pilha,
seu trabalho consiste e deterinar o n*vel *nio de seHZYncia de operaes Hue transfora #reor1aniza$ a pilha
ori1inal transforando!a na pilha e(i1ida.
Entraa
A prieira linha da entrada consiste de u Jnico inteiro = dando o nJero de casos de teste. :ada teste caso
consiste e u inteiro n indicando o nJero de tartaru1as na pilha. As prI(ias n linhas descreve a orde
ori1inal da pilha de tartaru1as. :ada ua das linhas cont o noe de ua tartaru1a, Hue coea co a tartaru1a
do topo da pilha e se1ue co os noes at a tartaru1a do fundo da pilha. %artaru1as tY noes e(clusivos, cada u
dos Huais ua cadeia de no ais de oitenta caracteres traada a partir de u conjunto de caracteres consistindo de
caracteres alfanuricos, espaos e o ponto#.$ As prI(ias n linhas na entrada do a ordenao pretendida da pilha,
ais ua vez, por noeao das tartaru1as de cia at ebai(o da pilha. :ada caso de teste consiste de e(ataente
An G1 linhas no total. , nJero de tartaru1as #n$ ser i1ual ou inferior a ABB.
Sa9a
0ara cada caso teste, a sa*da consiste de ua seHZYncia de noes de tartaru1a, ua por linha, indicando a orde e
Hue as tartaru1as deve abandonar as suas posies na pilha e subir para o topo. )sta seHZYncia de operaes deve
transforar a pilha de tartaru1as #da pilha ori1inal para a pilha e(i1ida$ e deve ser a soluo o ais curta poss*vel.
/e ais do Hue ua soluo de enor copriento poss*vel, HualHuer das solues pode ser reportadas coo
sa*da. "pria ua linha e branco depois de cada teste.
/aple "put
2
3
Yertle
Duke of Earl
Sir Lancelot
Duke of Earl
Yertle
Sir Lancelot
9
Yertle
Duke of Earl
Sir Lancelot
Elizabeth Windsor
Michael Eisner
Richard M. Nixon
Mr. Rogers
Ford Perfect
Mack
Yertle
Richard M. Nixon
Sir Lancelot
Duke of Earl
Elizabeth Windsor
Michael Eisner
Mr. Rogers
Ford Perfect
Mack
/aple ,utput
Duke of Earl
Sir Lancelot
Richard M. Nixon
Yertle
AM
Lon)est Na2 ,Coc$i"o 1ais "on)o. 0:C48A 11BNBNC4F4M4
:oo vocY deve saber, e(iste professores uito ocupados e co u calendrio cheio durante o dia. /eu professor,
vaos cha!lo 0rofessor 0, u pouco pre1uioso e Huer tirar ua soneca durante o dia, as, coo o seu
calendrio uito ocupado, ele no te uitas chances de fazer isso. )le realente deseja tirar apenas ua soneca
todos os dias. :oo ele vai tirar apenas ua soneca, ele Huer tirar a ais lon1a soneca poss*vel dado o seu
calendrio. )le decidiu escrever u pro1raa para ajud!lo nessa tarefa, as, coo disseos, 0rofessor 0 uito
pre1uioso e portanto, ele decidiu finalente Hue 8,:l deve escrever o pro1raaW
A entraa
A entrada consistir e u nJero arbitrrio de casos de teste, cada caso teste representa u dia. A prieira linha
de cada conjunto cont u nJero inteiro positivo s #no superior a 1BB$, representando o nJero de reunies
pro1raadas durante esse dia. 2as prI(ias s linhas e(iste atividades no se1uinte forato: Time1 time2 atividade
,nde time1 representa o tepo Hue coea a atividade e time2 o tepo Hue terina. %odos os horrios sero no
forato hh:mm, time1 ser sepre estritaente inferior a tieA, eles sero separados por u espao siples e todos
os tepos ser superior ou i1ual a 1B:BB e inferior ou i1ual a 1M:BB. 0ortanto, a resposta deve ser, neste intervalo
tab, ou seja, nenhua soneca pode coear antes das 1B:BB e depois das 1M:BB. A atividade pode ser HualHuer
seHZYncia de caracteres, as ser sepre na esa linha. 0ode!se supor Hue nenhua linha ser ais lon1o do Hue
A77 caracteres, Hue 1B eQ hh eQ 1M e Hue B eQ inutos eFB. Voc no pode assumir, no entanto, que a entrada
ser, em qualquer ordem especfica. 8ocY deve ler a entrada at che1ar ao final do arHuivo.
A sa9a
0ara cada caso teste, vocY deve ipriir a linha a se1uir:
Day #d: the longest nap start at hh:mm and will last for [H hours and] M minutes.
,nde d si1nifica o nJero de caso de teste #a partir de 1$ e hh: o oento e Hue o cochilo pode coear.
0ara e(ibir a durao da soneca, si1a estas re1ras siples:
1. /e a durao total [ for enos de FB inutos , basta ipriir bM inutes.b, onde M Q [.
A. /e a durao total [ e inutos aior ou i1ual a FB, ipriir bU hours and M inutes.b, onde
U Q [ C FB #inteiro da diviso, claro$ e M Q [ od FB.
2o deve!se preocupar co a concord+ncia #ou seja, deve!se ipriir b1 inutesb ou b1 hoursb se for o caso$. A
durao da soneca calculada pela diferena entre o in*cio e o fi do tepo livre, ou seja, se ua atividade terina
Vs 1N:BB e o prI(ios coea Vs 1N:NO, ento te!se #1N:NO!1N:BB$Q NO inutos para u poss*vel cochilo.
/e houver ais de ua aior cochilo co a esa durao, ipria o Hue acontece ais cedo. 0ode!se supor Hue
no haver u dia todo ocupado #ou seja, vocY pode considerar Hue professor no estar ocupado todo o dia e
sepre haver tepo para pelo enos u cochilo$.
/aple "nput
4
10:00 12:00 Lectures
12:00 13:00 Lunch, like always.
13:00 15:00 Boring lectures...
15:30 17:45 Reading
4
10:00 12:00 Lectures
12:00 13:00 Lunch, just lunch.
13:00 15:00 Lectures, lectures... oh, no!
16:45 17:45 Reading (to be or not to be?)
4
10:00 12:00 Lectures, as everyday.
12:00 13:00 Lunch, again!!!
13:00 15:00 Lectures, more lectures!
15:30 17:15 Reading (I love reading, but should I schedule it?)
1
12:00 13:00 I love lunch! Have you ever noticed it? :)
/aple ,utput
Day #1: the longest nap starts at 15:00 and will last for 30 minutes.
Day #2: the longest nap starts at 15:00 and will last for 1 hours and 45 minutes.
Day #3: the longest nap starts at 17:15 and will last for 45 minutes.
Day #4: the longest nap starts at 13:00 and will last for 5 hours and 0 minutes.
A6
Vito>s %a1i"6 0:C48A 11BNB1C4FFI4
, 1an1ster undialente conhecido 8ito &eadstone est indo para 2ova @or5. )le te ua 1rande
fa*lia l e todos eles vive na avenida .aafia. 4a vez Hue ele visita todos os seus parentes uitas vezes, ele
est procurando ua casa perto deles para orar. 8ito pretende iniizar a dist+ncia total a todos eles e chanta1eou
vocY para escrever u pro1raa Hue resolva o seu problea.
Entraa
A entrada constitu*do por vrios casos de teste. A prieira linha cont o nJero de casos de teste. 0ara cada
caso teste ser!lhe! dado o nJero inteiro de parentes r #B er e7BB$, be coo o nJero da rua #inteiros tab$
s1, sA, ... si, ... sr onde vive #B e si e<BBBB$. 2ote!se Hue vrios parentes pode viver no eso nJero de rua
#na esa rua$.
Sa9a
0ara cada caso de teste seu pro1raa deve escrever a *nia soa das dist+ncias entre a posio da casa de 8ito
#Hue dever ser ua posio Itia e relao Vs casas de seus parentes$ e a casa de cada u de seus parentes. A
dist+ncia entre dois nJeros de ruas si e sj dij Q f si!sj f.

/aple "put
2 // 2 casos de teste que vem a seguir:
2 2 4 // 2 parentes, um mora na rua 2 e outro na rua 4
3 2 4 6 // 3 parentes, um mora na rua 2, outro na rua 4 e outro na rua 6
5 6 1 2 4 6 // 5 parentes, um mora na rua 1, outro na rua 2, outro na rua 4 e 2 na rua 6
4 3 3 3 4 // 4 parentes, 3 moram na rua 3 e um mora na rua 4
/aple ,utput
2 // Vito moraria na rua 2 ou 4
4 // Vito moraria na rua 4
9 // Vito moraria na rua 4
1 // Vito moraria na rua 3
0robleas #e(erc*cios$ copleentares #http:CCicpcres.ecs.baDlor.eduConlinejud1eC $:
Bri)e 0:C48A 11BNB<C4FF;K
S$oe1aLer>s #ro:"e1 0:C48A 11BNB7P4FF5J
CDVII 0:C48A 11BNBFP4F4;G
%oot:a"" 0:C48A 11BNBMP4F4MI
<B
J3 Listas "i)aas ou encaeaas Q A"oca'(o Est@tica
)(iste duas foras para inserir al1uns eleentos antendo a orde lI1ica destes eleentos. /o elas:
a$ deslocar todos os deais eleentos
b$ anter u capo 2)[% para cada eleento, indicando Hual o prI(io
X coo se fosse u tre, co u capo "2-, Hue cont ua ou ais inforaes e u capo 2)[%, Hue cont o
endereo se1uinte dentro da estrutura.
"2-, 2)[% ou )., ou ."2=
"nforaes li1aao
8ejaos o e(eplo de u tre. A locootiva li1ada ao prieiro va1o e cada va1o li1ado ao prI(io.
)(iste al1uas inforaes relevantes relacionadas aos va1es, tais coo:
a$ %ipo: #1$ restaurante, #A$ passa1eiros, #<$ car1a
b$ :apacidade: toneladas, pessoas
c$ 'esponsvel: Hue o responsvel pelo va1o
d$ cone(o: Hual o va1o se1uinte]
&esta fora, deveos pensar coo seria a ipleentao de ua estrutura co os nodos li1ados ou encadeados. ,
encadeaento deve considerar vrios aspectos, os Huais so relacionados a se1uir.
2.1 Implementao de listas em vetores
A ipleentao utiliza u vetor #ou atriz$ para o capo "2-, e u vetor para o capo 2)[%.
A orde lI1ica dos eleentos obtida atravs do capo 2)[%, no iportando a localizao f*sica dentro da estrutura.
, capo 2)[% do Jltio eleento i1ual a !4, indicando Hue ele o Jltio eleento.
3asta saber e Hue local est o prieiro eleento da lista para se conhecer todos os deais eleentos.
A lista pode ter u nodo de :ontrole #NC$, Hue seria a locootiva. 2a ipleentao das listas sobre vetores ele
indispensvel.
2.1.1 Estr&t&ra da (ista
&evido ao fato da estrutura ser encadeada, a lista deve ser ipleentada sobre A vetores, e no soente u coo era feito na
alocao seHuencial. :oo e(eplo, podereos utilizar os vetores in&o e ne8t.
Al dos dois vetores # in&o e ne8t $, deveos ter a inforao is2, Hue indicar Hual ser o nodo Hue est dispon*vel para
insero. 4a inforao referente ao 2odo de :abealho tab pode ser utilizada. 0ara facilitar, supoos Hue o 2odo de
:abealho ser sepre o prieiro nodo do vetor.
typedef struct { class lista{
int info [10]; private:
int next [10]; int info[10], next[10];
int disp, primeiro, ultimo; int primeiro, ultimo, disp;
} LISTA; pu)lic:
void CriaPnd (int elem);
LISTA lista; }

2.1.3 ilha dos 4odos 5ispon6veis
/erve para 1uardar os nodos Hue esto dispon*veis. %odos os nodos Hue esto dispon*veis, isto , todas as posies dos vetores
in&o e ne8t Hue aloca a lista e no pertena V esa, fora ua estrutura V parte do tipo pilha, denoinada 02&.
8oltando ao e(eplo do tre, a #ND controla os va1es vazios Hue esto no estacionaento.
<1
, topo desta pilha fica apontado por is2. 4a rotina denoinada :ria02& deve ser criada. , objetivo desta rotina
siplesente encadear os nodos da estrutura. , ne8t do prieiro nodo aponta para o se1undo, Hue aponta para o terceiro,
Hue aponta para o Huarto, e assi sucessivaente, at Hue o Jltio nodo aponta para !1, indicando o trino dos nodos
dispon*veis. Ao final do encadeaento, a estrutura deve ficar coo a apresentada abai(o #supondo O nodos dispon*veis no
total para a lista k de B a F$.
"nfo 2e(t
B
1
1
A
A
<
<
N
N
7
7
F
F
!1
is2QB 2ri1eiroQ !1 u"ti1oR !1
Rotina 2ara a Cria'(o a #ND #0ilha dos 2odos &ispon*veis$:
void lista::criapnd (int elementos) { // cria a pnd
for (int i = 0; i<elementos; i++) {
next[i] = i+1;
}
next[elementos-1] = -1;
disp = 0;
primeiro = ultimo = -1;
}
/e a criao da #ND, fica uito dif*cil saber onde inserir e Huantos nodos ainda esto dispon*veis.
2.1.3 Insero em &ma lista
A insero na lista poder ser feita:
no in*cio da esa
no final da esa
nua deterinada posio n
na posio correta para Hue a lista peranea ordenada #no caso de ua lista ordenada$
"nfo 2e(t
B
1OF !1
1 A
A <
< N
N 7
7 F
F !1
is2Q1 2ri1eiroQ B u"ti1oR B
:oo e(erc*cio, insira os valores 7O, AB1, 1A e 16. #"nsira cada eleento no final da lista$
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
<A
Al1orito para "nsero no &ina" de ua lista #vlido tab para ua fila encadeada$:
void lista::inserefim (int elem) { //insere no final da pnd
info[disp] = elem;
if (primeiro ==-1) {
primeiro = disp;
}
next[ultimo] = disp;
ultimo = disp;
disp = next[disp];
next[ultimo] = -1;
}
Al1orito para "nsero no in9cio de ua lista:
void lista::insereinicio (int x) { //insere no incio da pnd
info[disp] = x;
if (ultimo==-1) {
ultimo = disp;
}
int aux = next[disp];
next[disp]=primeiro;
primeiro = disp;
disp = aux;
}
Inser'(o 1anteno os e"e1entos orenaos3
/upondo Hue se deseje inserir os eleentos antendo a lista ordenada lo1icaente, ua variao da rotina de insero deve
ser criada. A1ora insira de fora visual os eleentos 45, 4< 54I e KJ, de odo Hue ao percorrer a lista, a esa esteja
ordenada por orde alfabtica ascendente.
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
A")orit1o 2ara Inser'(o na Lista 1anteno!a orenaa:
/upondo Hue se deseje inserir os eleentos antendo a lista ordenada lo1icaente, desenvolva o al1orito para tal funo.
void lista::InsereOrdem (int elem) { //insere mantendo ordem ano final da pnd
} 1ESE23453E6 E& 5%746%$86I4
<<
2.1.7 !etirada em &ma lista
0ara siplificar, consideraos Hue o valor a ser retirado da lista seja inforado pelo usurio. 2o caso abai(o, a lista cont
al1uns eleentos. &eonstre 1raficaente, passo!a!passo coo ficaria a retirada dos nodos [, A e 3, e seHuYncia.
"2-, 2)[%
B
A 1
1
3 A
A
[ <
<
N
N
7
7
F
F
!1
is2R < 2ri1eiroR B u"ti1oR <
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
"2-, 2)[%
B

1

A

<

N

7

F

is2R 2ri1eiro R u"ti1oR
Crie ent(o o a")orit1o 2ara retiraa e u1a "ista encaeaa:
void lista::RetiraElem (int elem) { //Retira um elemento especfico da lista
}
<N
K3 Listas "i)aas ou encaeaas Q A"oca'(o inO1ica
A desvanta1e da alocao esttica clara: Huando se utiliza ua estrutura linear, ua Huantidade de
bDtes fica alocada eso se ser utilizada. ,s dois vetores #"2-, e 2)[%$ so utilizados apenas e
parte e a cople(idade auenta e(ponencialente Huando se deseja ipleentar A ou ais listas sobre a
esa rea #vetores$.
A estrutura da lista li1ada din+ica uito siples. )(iste soente A capos #"2-,, 2)[%$, sendo
Hue o capo ne(t u ponteiro para o prI(io eleento da lista.
0odeos visualisar os nodos coo apresentado abai(o

Info !e"t Info !e"t Info !e"t
.ista !!!\ pYra B7&: !!!\ a !!!\ uva 24..
B7): B7): B7&:
, "nfo pode ser u inteiro, u caracter ou ua strin1. 0ara ilustrar considerareos abai(o a criao de
ua lista cujo info ua strin1 de taanho 1B:
typedef struct LISTA {
} lista;
8.1 Incl&so de elementos no in6cio da lista 'ilha+
Ao considerar as estruturas de dados do tipo lista, pilha ou fila, pode!se verificar Hue elas so idYnticas.
/ero sepre copostas por u capo ou ais de inforaes e u capo 2e(t, Hue aponta para o
prI(io nodo.
:o relao V anipulao dos dados, os al1oritos de anipulao das pilhas so os ais siples,
se1uidos pelos al1oritos das filas e listas. 2as listas a cople(idade auenta por possibilitar inseres e
retiradas de HualHuer nodo Hue pertena V estrutura.
:oo os al1oritos da pilha so ais siples, esta ser a prieira estrutura apresentada.
struct PILHA {
} pilha;
struct pilha *topo, *aux;
2o in*cio do pro1raa, antes de HualHuer operao co a lista, a esa deve ser inicializada co 24.,,
indicando Hue est vazia.
topo = aux = NULL;
<7
:onsiderando ua pilha e(istente co al1uns nodos:
Info !e"t Info !e"t Info !e"t
topo m pYra B7&: m a m uva 24..
B7): B7): B7&:
a$ , prieiro passo obter u nodo para inser*!lo na lista:
aux = ne( pilha;
Info !e"t
au( m

b$ , prI(io passo inserir o valor desejado no nodo rec!alocado.
Cin >> info;
Info !e"t
au( m elancia

c$ &epois deve!se fazer o ne(t do nodo inserido apontar para o in*cio da lista.
aux->next = topo;
Info !e"t Info !e"t Info !e"t
topo m pYra m a m uva 24..
Info !e"t B7):
au( m elancia B7):
d$ por Jltio deve!se fazer o ponteiro pilha apontar para onde o ponteiro aux aponta.
topo = aux;
Info !e"t Info !e"t Info !e"t
pYra ))-B m a m uva 24..
topo m Info !e"t B7): ))-B
au( m elancia B7):
'eunindo os passos a,b,c e d, teos:
aux = ne( pilha;
cin >> info;
aux->next = topo;
topo = aux;
a$ :o base na e(plicao acia, faa a rotina para e(cluir u eleento da pilha.
b$ -aa u pro1raa copleto para incluir eleentos na pilha. 2o oento Hue for di1itado u eenter\
para a "nforao interropa a leitura pro1raa e ostre todos os eleentos Hue fora inseridos na pilha
# if (strcmp(aux->info,)==0) break $.
<F
8.3 Incl&so de elementos em &ma fila
2a fila, os dados so inseridos no final da estrutura. A definio da estrutura peranece a esa,
alterando soente o noe da esa.
typedef struct FILA {
} fila ;
fila *frente, *re, *aux;
2o in*cio do pro1raa o fundaental inicializar os < ponteiros para a estrutura:
frente = re = aux = NULL;
a$ , prieiro passo obter u nodo para inser*!lo na lista.
aux = ne( fila;
Info !e"t
au( m 24..

b$ ApIs insere!se o valor desejado no nodo rec!alocado, atualizando o seu capo Ne8t para N/LL:
cin >> info;
aux->next = NULL;
Info !e"t
au( m pYra 24..
B7): B7):
c$ &eve!se encadear e se1uida o nodo inserido #A$ . 0ara ilustrar, considera!se aHui a insero de u
se1undo eleento #3$.
if (re=NULL){ //A fila est vazia
frente = aux;
else { //A fila j contm alguns elementos
re->next = aux;
}
re = aux;
frente m Info !e"t
au( m pYra 24..
re m B7):
B7):
frente m Info !e"t re m Info !e"t
au( m pYra FHDC S 1e"ancia N/LL
B7): B7): B7&: B7&:
:o base nas e(plicaes acia, faa a rotina para e(cluir u eleento da pilha. -aa tab u
pro1raa copleto para incluir C e(cluir eleentos da fila, ostrando!a no final.
A
B
A
B
A
B

Você também pode gostar