Jump to content
Sign in to follow this  
Psycop

LADDER_QUEUE

Recommended Posts

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

Edited by Psycop

Share this post


Link to post
Share on other 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

Edited by Colector Boy

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
HappyHippyHippo

ordena o patamar e retira o primeiro ou último dependendo da ordem da ordenação


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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.