No.2.1 解密QQ-队列

一、解密一个队列:“6 3 1 7 5 8 9 2 4”

首先将第1 个数删除,紧接着将第2 个数放到这串数的末尾,再将第3 个数删除并将第4 个数放到这串数的末尾,再将第5 个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是结果

注意:

  1.这里的删除、从队头移动到队尾,并不是像python里面那样,真的list.pop, list.insert,而是通过指针的移动,假装进行删除、移动,比如:head++表示头位置后移,相当于删除了原来的队头;q[tail] = q[head], tail++, head++ 相当于将队头移动到队尾

  2.tail 指向的是队尾(即最后一位元素)的下一个位置,那么队列中只剩下一个元素时,队首和队尾不会重合(相差1);

 

#include "stdio.h"
int main()
{
  int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail;

  head = 1;
  tail = 10; //队列中已经有9个元素了,tail指向队尾的后一个位置

  while (head < tail){
    //打印队首并将队首出队
    printf("%d ",q[head]);
    head++;

    //先将新队首的数添加到队尾
    q[tail] = q[head];
    tail++;

    //再将队首出队,但是不打印
    head++;
  }
  return 0;
}

 

二、队列:只许在队首进行删除(出队),队尾进行插入(入队)操作,FIFO原则

struct queue
{
  int data[100];  //队列的主体,用来存储内容
  int head;    //队首
  int tail;     //队尾
};         //放在main函数的外面,并且有 “;”

struct queue q;   //定义一个变量q,struct queue 要作为一个整体存在;

q.head=1;
q.tail=1;
scanf("%d",&q.data[q.tail]);  //队列成员的访问

改写上面的例子:

struct queue {
  int data[100];
  int head;
  int tail;
};

void main(){
  struct queue q;  //初始化队列
  q.head = 1;
  q.tail = 1;

  int i,n;
  scanf("%d", &n);  //输入数字

  for (i=1;i<=n;i++){  //将输入的数字,写入队尾,并使队列的尾指针自加
    scanf("%d",&q.data[q.tail]);
    q.tail++;
  }

  while (q.head < q.tail){  //解密过程,注意q.data的使用
    printf("%d ",q.data[q.head]);
    q.head++;

    q.data[q.tail] = q.data[q.head];
    q.tail++;

    q.head++;
  }
}

posted @ 2021-07-07 10:57  雅丽梅  阅读(105)  评论(0)    收藏  举报