реализация структуры данных типа очереди с использованием массивов

Я столкнулся с ситуацией, когда мне нужно реализовать структуру данных типа очереди, это примерно так:

(1) Предположим, имеется массив data [50] = {1,2,3,4,5,6};

(2) int Front должен указывать на первый индекс, а int Rear должен указывать на последний индекс.

(3) Теперь мне нужно добавить первый и второй элементы этого массива. Предположим, я делаю это (i + 2 = 3), и это 3 будет наконец установлено путем выполнения back + 1 (data [rear + 1]). Теперь, когда происходит второе выполнение, нам не нужно принимать во внимание первые два элемента (они уже добавлены). Итак, в этом случае мы можем сделать data [front + 2]. Но обратите внимание, потому что это +2 будет сделано только в первый раз, после этого будет просто +1 (потому что мы добавили только один элемент, а в первый раз добавим 2 элемента) .И элемент, полученный при сложении, должен идти к последнему из полученного индекса, например "3", в конце концов, он будет иметь следующий вид {1,2,3,4,5,6,3}.

(4) Таким образом, мы должны учитывать

(4.a) Увеличение тыла на единицу при каждом добавлении.

(4.b) Увеличение Front на единицу (примите первое добавление, в котором мы добавляем два элемента).

(5) Моя идея сделать это так:

    #include <stdio.h>
    #define MAX 50
    int data[MAX];
    int rear = - 1;
    int front = - 1;

    void main()
    {
     int rear=6, front=0;
     data[size]={1,2,3,4,5,6};
     int count=size;
     //First do addition of the first two elements
     data[rear]= data[0]+data[1];
     for(i=front; i<size*2-1 ; i++) //we are doing data*2-1 because we know the final obtained on doing all the addition until there is 1 element will have the size (size*2-1).
      {
       do
        { 
         //here we do addition data[rear+1]=data[front]+data[rear];
         // rear++;     
         count--;
        }while (count>1);
       }
      for(i=0; i<size*2-1 ; i++)
      {
       printf("%d ", data[i]); //Now this must print "1,2,3,4,5,6,3,6,9,12,21" (addition of element at front and rear)
      }         

    }

** Я сомневаюсь в том, как увеличить Front на два сложения в первый раз и путем увеличения на единицу после первого добавления, чтобы первый всегда указывал на добавляемый элемент (увеличение не сложно, я это сделал). Помогите, пожалуйста, по Front increment, Алгоритм и код буду очень признателен.


person user3206225    schedule 06.02.2014    source источник
comment
Не существует size, и существует несколько способов решения проблем обнаружения полного или пустого в кольцевом буфере. Некоторые из них здесь.   -  person WhozCraig    schedule 06.02.2014
comment
@WhozCraig, извините, я все еще не могу понять, что вы только что сказали. Не могли бы вы объяснить мне подробнее.   -  person user3206225    schedule 06.02.2014


Ответы (2)


int max = 50;
int index = 0;
int endIndex = 5; //You can compute the length. I will just hard code
int list[max] = {1,2,3,4,5,6};
int front = list[index];
int rear = list[endIndex];

while (index!= endIndex) 
{
if (index==0)
{
        index++;
        list[endIndex+index] = front+list[index];
        rear = list[endIndex+index];
        index++;
        front = list[index];
}
else 
{
        list[rear+1] = front + rear;
        index++;
        front = list[index];
        rear = list[endIndex+index];
}
}

Это должно сделать то, что вы ищете. Я не тестировал это, но я считаю, что это то, что вы описали.

person Alex Johnson    schedule 06.02.2014
comment
Спасибо за попытку помочь мне, но ваш код выдаст результат 3,4,5,6,0,0,0,0,0 .... но желаемый результат будет 1,2,3,4,5,6 , 3,6,10,15,21 (на данный момент я не могу отметить это правильно). Помогите, пожалуйста :), я думаю, нам нужно использовать указатели, потому что, как вы говорите, мы потеряем первые два элемента в окончательный список [размер]; (Я имею в виду, что он также не будет отображать 1 и 2). Но я должен отображать их, когда я распечатываю список [размер], но они не должны участвовать дополнительно, если они добавляются один раз. (Я имею в виду, что если 1 + 2 = 3, эти 3 идут, наконец, как 1234563, тогда передняя часть должна указывать к 3, чтобы добавить наконец с 3) - person user3206225; 06.02.2014
comment
и этот список Sizeof даст размер всего массива (а не количество элементов), но не беспокойтесь, я могу это исправить. Но проблема в том, что я упоминаю в первом комментарии, попробуйте помочь мне в этом. Спасибо - person user3206225; 06.02.2014
comment
Я отредактировал свою предыдущую заявку. Извините за задержку. У меня были ошибки с некоторыми из моих переменных, поэтому я вынул одну и жестко запрограммировал длину массива. Посмотри, может ли это решить твои проблемы. - person Alex Johnson; 06.02.2014
comment
вывод этого кода: {1 0 3 4 6 6 0 0 0 0 0 0}, все еще неверно :) - person user3206225; 06.02.2014
comment
Наконец-то я это сделал, полный код вы можете увидеть ниже. И спасибо за попытку мне помочь. - person user3206225; 07.02.2014

Наконец мне удалось решить вопрос, я оставляю здесь свой код для других (если они будут использовать его в будущем):

#include <stdio.h>

void main()
{
int max = 50;
int index = 0,Front=0,Rear,min,min2,location,i,location2,flag[30],check=0,j;

int data[50] = {1,2,3,4};
 Rear=3;
//Rear=size-1
for(i=0; i<=Rear;i++)
{
flag[i]=0;
 //printf("");
 }
int count=Rear;
do
{
//printf("check5 \n ");
if(Front==0)
 {
printf("check1 \n ");

Rear++;
 data[Rear]=data[Front] +data[1];
    flag[Front]=1;
    flag[Rear]=0;
        flag[1]=1;
 printf("datafront: %d\n ", data[Front]);
  printf("*****************dataRear: %d\n ", data[Rear]);
 printf("Front : %d\n ", Front);
printf("Rear : %d \n", Rear);
 //printf("flagRear: %d\n ", flag[Front]);
Front=Front+2; 
//Rear++;
 }

   if(data[Front]==data[Rear] && flag[Rear] ==0 && flag[Front]==0 ) 
 { 
    printf("check3 \n ");
     printf("Front : %d\n ", Front);
    // Rear++;
printf("Rear : %d \n", Rear);
printf("dataFront1: %d\n ", data[Front]);
printf("dataRear1: %d\n ", data[Rear]);
    data[Rear+1]= data[Front] +data[Rear];
    printf("************dataRear[Rear+1]: %d\n ", data[Rear+1]);
    flag[Front]=1;
    flag[Rear]=1;
    flag[Rear+1]=0;
    printf("check Front front : %d\n", Front);
                for(j=Front+1;j<=Rear;j++)
                {
                if(flag[j]==0)
                {
                Front=j;    
                 break;             
                }
                }           
//  Front++; 
    Rear++;
}

  if(data[Front]<data[Rear] && flag[Rear] ==0 && flag[Front]==0) 
   {         
         printf("check4 \n ");   
                 printf("Front : %d\n ", Front);
printf("Rear : %d \n", Rear);
printf("dataFront1: %d\n ", data[Front]);
printf("dataRear1: %d\n ", data[Rear]);
 printf("Flagcheck data[6].flag : %d \n",flag[6]);
                int start= Front+2;
                min= data[Front];
                for(j=Front+1;j<=Rear;j++)
                {
                if(flag[j]==0)
                {
                min2=data[j];
                location2=j;
                printf("j = %d \n",j);
                break;
                }
                }
                location=Front;

                 for(i=start;i<=Rear;i++) 
                {
                    if (data[i] <min && flag[i]==0) 
                    {
                        min=data[i];
                        location=i;     
                        min2=min;   
                    }
                    if (data[i]<min2&& flag[i]==0) 
                    {
                        min2=data[i];
                        location2=i;
                    }       
                }
                data[Rear+1]= min2+min; 
                printf("min= %d\n", min);
                printf("min2= %d\n", min2);
                printf("location= %d\n", location);
                printf("location2= %d\n", location2);
                printf(" ***********data[Rear+1] = %d\n", data[Rear+1]);
                flag[location2]=1;
                flag[location]=1;
                flag[Rear+1]=0;

                for(j=location+1;j<=Rear;j++)
                {
                if(flag[j]==0)
                {
                Front=j;    
                 break;             
                }
                }           
                Rear=Rear+1;                
 printf("Front : %d\n ", Front);
printf("Rear : %d \n", Rear);
 }  
//printf("\n");
//printf("Front : %d\n ", data[Front]);
//printf("Rear : %d \n", data[Rear]);
count--;
} while(Front!=Rear && count>0);
for (i=0;i<15;i++)
{
 printf(" %d  ", data[i]);
}
//char path[100]={'\0'};
//traverse_tree(data, 10,path);
printf("\n");
}
////
person user3206225    schedule 07.02.2014