30/09/2018, 20:09

Cần giải đáp về HÀNG ĐỢI!

Mình có CODE sau:

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 100
struct sv
{
       int ma;
       char ht[20];
};
struct queue
{
       sv data[max];
       int f,r;
};
void kt(queue &q)
{
     q.f=q.r=-1;
}
int ktr(queue q)
{
     if (q.f==-1&&q.r==-1)
        return 1;
     else
         return 0;
}
int ktd(queue q)
{
     if (q.f==0&&q.r==max-1)
        return 1;
     else
         return 0;
}
void push(queue &q, sv x)
{
     if (ktd(q))
        printf("day");
     else
     {q.r++;
     q.data[q.r]=x;
     }
}
sv pop(queue &q)
{
             if(ktr(q))
                       printf("rong");
             else
             {sv x=q.data[q.f];
                 for(int i=q.f;i<q.r;i++)
                 
                               q.data[i]=q.data[i+1];
                               q.r--;
                 
              
              return x;
 }}
 void nhap(queue &q)
 {
      sv x;
      int n, i;
      printf("n="); scanf("%d",&n);
      for(i=0;i<n;i++)
      {
                      printf("ma"); scanf("%d",&x.ma);
                      printf("ten"); fflush(stdin); gets(x.ht);
                      push(q,x);
       }
   }
   void xuat(queue q)
   {int i;
[      for(i=q.f;i<q.r;i++)
      	{
            
            printf("%d %s", q.data[i].ma,   q.data[i].ht);
            
    	}
       }
 main()
 {
       queue q;
       kt(q);
       nhap(q);
       xuat(q);
       pop(q);
       xuat(q);
       getch();
 }'

Mình muốn hỏi phần

void push(queue &q, sv x)
{
     if (ktd(q))
        printf("day");
     else
     {q.r++;
     q.data[q.r]=x;
     }
}

và phần

sv pop(queue &q)
{
             if(ktr(q))
                       printf("rong");
             else
             {sv x=q.data[q.f];
                 for(int i=q.f;i<q.r;i++)
                 
                               q.data[i]=q.data[i+1];
                               q.r--;
                 
              
              return x;
 }}

Tại sao ở phần push lại là q.data[q.r]=x mà không phải là x=q.data[q.r]; ? Mình không hiểu . ở phần pop cũng vậy!

Ngô Doãn Tuấn viết 22:19 ngày 30/09/2018

Bạn ơi bạn cho code vào markdown đi
Rồi mọi người sẽ cùng thảo luận XD

Dung Nguyen viết 22:23 ngày 30/09/2018

sao mình k sửa đc markdown !!! giúp mình với

Ngô Doãn Tuấn viết 22:11 ngày 30/09/2018

Bạn thông cảm mình không sửa bài viết của bạn được
Bạn cho code của bạn vào giữa 3 dấu ``` này nhé
Nếu không được thì sẽ nhờ sự trợ giúp của các leader hoặc anh Đạt

Phan Hoàng viết 22:13 ngày 30/09/2018

Queue hàng đợi, theo nguyên tắc vào trước ra trước, FIFO.

Lệnh push: đẩy vào cuối hàng

  • Giả sử queue của bạn có 3 SV (kích thước r = 3)
  • Bạn tăng r=4 và đẩy bạn SV thử tư vào index=4, queue[4] = SV_thu_4, nghĩa là đẩy vào cuối hàng thôi.

Lệnh pop: nhấc ra khỏi đầu hàng

  • Giả sử queue của bạn giờ có 4 bạn. Muốn nhấc bạn đầu tiên khỏi hàng đợi?
  • Bạn lấy SV là thằng đầu hàng (gắn vào x), sau đó dồn hàng, trước kia thằng 2 giờ sẽ trở thành đầu hàng (index=1) <hình như là 0 ^^>, thằng 3 trở thành 2, 4 trở thành 3. Vậy thôi.

Ngoài push, pop còn có lệnh shift và peek.

Bài liên quan
0