【啊哈算法学习笔记】1.队列

1.基本含义:

毋庸置疑,队列是一种先进先出的数据结构,如生活中的排队,叫号机等待,等等,

2.非结构体方法:

定义一个数组 q,存放队列的值,一个head代表指向的队首,一个tail代表指向的队尾的下一个元素(这是为了判别是否为空。

我们不妨假设,head == tail的时候队列为空。

删除队首操作(出队): head++;(虽然直接指向下一个会浪费空间,但是却减少了移动一群数字的时间。)

添加元素操作(入队):q[tail] = x; tail++;(先添加元素,然后,tail向后移)

int q[100];  //队列存放到数组中
int head;    //存放头
int tail;    //存放尾

/*初始化*/
head = 1;
tail = 10;    //假设从1开始利用,且一共有9个元素,则tial指向最后一个元素的下一个位置。

/*删除元素*/
head++;

/*增加元素,如增加元素x */
q[tail] = x;
tail++;

例子:比如有一串数字,我们按照要求,令第一个元素删除,第二个元素跟到这串数字后面,第三个元素删除,第四个元素跟到后面,然后把删除后的一串新的数字打印出来。  eg : 6 3 1 7 5 8 9 2 4 ,进过这样的转化后,成为:6 1 5 9 4 7 2 8 3。 

思路:先用队列将其存储起来,第一个数字先打印,然后出队,然后将第二个元素值插到队尾,再将第二个元素出队,。。。。直到队列没有元素,则打印出来的数字集合就是这串新数字。

代码详解:

#include <stdio.h>
int main()
{
    int q[102] = {0,6,3,1,7,5,8,9,2,4};
    int head = 1;//我们从一开始
    int tail = 10;//tail指向最后一个元素的下一个位置

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

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

        //再将队首出队
        head++;
    }
    
    return 0;
}

3.结构体方法:

由上面我们可以清楚的知道,队列需要三个元素:1个数组存放队列的信息,2个int值存放队首和队尾的信息。因此可以将他们设成一个结构体,方便操作。即:

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

同样,入队和出队操作也与此对应。

struct queue q;//定义一个结构体元素q

/*入队*/
    q.data[tail] = x;
    tail++;

/*出队*/
    q.head++;

同样上面的例子给出完整的代码:

#include <stdio.h>

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

int main()
{
    int i;
    struct queue q;

    //初始化队列
    q.head = 1;
    q.tail = 1;

    for(i=1;i<=9;i++)
    {
        //依次输入9个元素并入队
        scanf("%d",&q.data[q.tail]);
        q.tail++;
    }

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

        //将新的队首元素插入队尾
        q.data[q.tail] = q.data[q.head];
        q.tail++;
        //删除队首元素
        q.head++;

    }
    return 0;
}

         上面看起来比原来麻烦多了,但是对我们理解思想有很大的帮助。 

4.表示感谢:

       《啊哈算法》,值得推荐,建议把上面的代码打一打,很有意思。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值