【问题标题】:queue type data structure implementation using arrays使用数组的队列类型数据结构实现
【发布时间】:2014-02-06 15:24:28
【问题描述】:

我遇到过一种情况,我必须实现一个队列类型的数据结构。是这样的:

(1)假设有一个数组data[50]= {1,2,3,4,5,6};

(2) int Front 必须指向第一个索引,int back 必须指向最后一个索引。

(3)现在我必须添加这个数组的第一个和第二个元素。假设我这样做 (i+2=3) 并且这个 3 最终将通过执行后置+1 (data[rear+1]) 来设置,现在当第二次执行发生时,我们不必考虑前两个元素(他们已经添加了),所以在这种情况下我们可以做 data[front+2]。 但请注意,因为这个+2只会在第一次完成,之后就只是+1(因为我们只添加了一个元素,而我们第一次添加了2个元素) .并且添加时获得的元素必须到达索引的最后一个,例如获得的“3”最终会像这样{1,2,3,4,5,6,3}。

(4)所以我们要考虑到

(4.a) 每次添加后,Rear 加一。

(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)
      }         

    }

**我的疑问是如何在第一次添加前增加两个,并在第一次添加后增加一个,这样 first 将始终指向要添加的元素(增加并不难,我已经做到了)。 请帮助我进行前端增量,算法和代码将非常感激。

【问题讨论】:

  • 没有size,并且有多种方法来解决循环缓冲区中的full-vs-empty检测问题。 Some of them here.
  • @WhozCraig 对不起,我仍然无法理解,你刚刚说了什么。能否请您详细解释一下。

标签: c arrays algorithm data-structures queue


【解决方案1】:
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];
}
}

这应该可以满足您的需求。我没有测试它,但我相信它是你描述的。

【讨论】:

  • 感谢您尝试帮助我,但您的代码将给出输出“3,4,5,6,0,0,0,0,0....”,但期望的输出是“ 1,2,3,4,5,6,3,6,10,15,21" (所以我暂时无法将其标记为正确)。请帮助 :) ,我认为我们需要使用指针,因为你告诉我们将失去最终列表中的前两个元素[size]; (我的意思是它也不会显示“1”和“2”)。但是当我打印列表[大小]时我必须显示它们,但如果它们被添加一次,它们不应该参与。(我的意思是如果1 + 2 = 3,这3最后像,1234563然后前面必须指向到“3”最后加上“3”)
  • 这个 Sizeof 列表将给出所有数组的大小(不是元素的数量),但不用担心我可以纠正这个问题。但问题是我在第一条评论中提到的,请尝试帮助我在那里面。谢谢
  • 我编辑了我之前提交的内容。抱歉耽搁了。我的一些变量有一些错误,所以我取出了一个,并硬编码了数组的长度。看看这是否可以解决您的问题。
  • 这段代码的输出是 { 1 0 3 4 6 6 0 0 0 0 0 0 },仍然不正确:)
  • 我终于做到了,你可以在下面看到我的完整代码。感谢您尝试帮助我。
【解决方案2】:

最后我设法解决了这个问题,我将我的代码留给其他人(如果他们将来使用它):

#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");
}
////

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多