Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Psycop

LADDER_QUEUE

Mensagens Recomendadas

Psycop

Boa tarde

Tenho a seguinte estrutura:

typedef struct
{
  int steps;
  ITEM item; //ITEM é uma outra estrutura
}LADDER_ITEM;

No entanto eu pretendo receber várias destas estruturas dentro de um array inicial e posteriormente separa-las em "escada" usando o número de steps, ou seja criando um novo array de estruturas para cada step.

Exemplo:

array_1step - todas as estruturas onde o steps seja = 1 vão para dentro

e assim sucessivamente.

Até agora cheguei a algo assim, mas estou tão confuso que nem sei se a lógica está correcta e faz sentido...

//Find for step number on the entry point array
for (i = 0; i < STEPS_N_MAX; i++)
{
//if step value = i
if(item[ i ].steps == i)
{
//copy LADDER_ITEM to a new array "list"
item[ i ].setps = i;
item[ i ] = queue[ i ];
}
}

Mas estou com algumas dificuldades em traduzir isto para código.

Alguém para me dar umas dicas? Um exemplo para que eu possa perceber e adaptar?

Cumprimentos

Editado por Psycop

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Colector Boy

Precisas de saber quantos steps tens

Precisas de saber quantas estruturas tem steps = 1 ou o valor que for

Porque não utilizas um método de ordenação de arrays?

Ordenas o array inicial e ficas com ele em escada depois verificas onde existem alterações, isto é, verificas quando quando steps passa de 1 para 2, de 2 para 3 etc.

Quando notares uma alteração dessas crias um novo array.

Talvez a melhor forma seja utilizar memoria dinâmica pois podes alterar o tamanho dos arrays.

Em alternativa a memoria dinamica podes percorrer o array_inicial para saber quantos steps tens e quantas estruturas tem o valor steps = ao valor que for

Editado por Colector Boy

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Precisas de saber quantos steps tens

Precisas de saber quantas estruturas tem steps = 1 ou o valor que for

não existe nenhuma obrigatoriedade em saber esse tipo de informação antes de começar o processo

@Psycop

a primeira coisa que tens de fazer é ensar na estrutura de dados que pretendes ter no final.

como pensar guardar a informação final ? consegues descrever-la ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

Bom Dia,

Uma das restrições é o uso de memória dinâmica, por esse motivo a alocação terá de ser estática...

Poderia indicar-me algum exemplo ou pseudo-código para eu tentar perceber a forma de implementar o algoritmo?

Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

se a alocação tem de ser estática, necessitas saber dos limites impostos pelo problema, coisas como (todas ou algumas) :

- qual o número máximo de itens

- qual o número máximo de degraus


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

existe a possibilidade de alterar a definição de LADDER_ITEM ? isto é, é possivel adicionar um campo de controlo ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

a maneira mais simples (não quer dizer que seja a mais eficiente) é o uso de uma matriz (array bidimensional) com número máximo de degraus de altura e o número máximo de items de largura.

adicionas uma variável de controlo à estrutura LADDER ITEM, exemplo:

typedef struct
{
 char valid;
 int steps;
 ITEM item;
}LADDER_ITEM;

onde o valor do parametro valid sera usado para determinar se a estrutura tem informação relevante.

inicias todos os elementos da matriz marcando o valor valid a zero (por exemplo), e depois é só percorrer o array original e ir "inserindo" na matriz coerentemente, isto é, o valor de step será a linha da matriz, e a posição horizontal será a primeira instância que encontrares que tenha o valor valid de zero. no final, marcas o elemento "inserido" ao alterares o valor de valid para um valor diferente do inicial (por exemplo, 1)


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycop

Bom dia,

Entretanto já consegui implementar o "PUSH" para o Patamar correcto, mas agora a minha dúvida é Fazer o POP, sabendo que o primeiro item a ser removido será o elemento no patamar mais elevado e com o atributo count mais elevado.

Alguém me consegue explicar em pseudo-código ou algo semelhante o algoritmo para chagar ao patamar mais elevado e dentro dos items no patamar mais elevado verificar o item.count maior fazer o POP a esse elemento.

Cumps

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.