美文网首页C语言程序员
C语言编程学习:线性结构的两种常见应用之二:队列

C语言编程学习:线性结构的两种常见应用之二:队列

作者: 小辰带你看世界 | 来源:发表于2018-05-17 22:41 被阅读82次

    C语言是面向过程的,而C++是面向对象的

    C和C++的区别:

    C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。

    C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

    C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

    线性结构的两种常见应用之二:队列

    定义:一种可以实现先进先出的存储结构。

    分类:

    链式队列:以链表实现的队列

    静态队列:以数组实现的队列。

    静态队列通常都必须是循环队列:

    静态队列为什么必须是循环队列?

    小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    如上图,一个队列,从0到8共9个元素,把-1放在位置0,-2放在位置1,依次。如果f(front指针)指向第一个(0),那么r(rear指针)则指向最后一个的下一个(8),如果f指向第一个元素的前一个元素(0前,f1),那么r则指向最后一个元素(r1)。以f指向第一个元素,r指向最后一个元素的后一个,如果在队列中增加一个元素,比如把-9放在位置8,那么r则指向8的下一个。如果是删除队列元素,比如删除-1,则f指向-2.也就是f指针用来删除元素,r指针用来增加元素。如果用传统的数组来实现队列,增加元素,r只能往上移,删除元素,f也是往上移。比如删除3个元素,则f指向-4,因为f只能增,那么导致-1、-2、-3这3个元素占据的内存位置将无法再使用。所以用传统数组来实现的队列必须是循环队列!循环

    队列需要几个参数来确定?

    需要两个参数来确定:front,rear

    循环队列各个参数的含义 ,2个参数不同场合有不同的含义:

    1)队列初始化:front和rear的值都是零;

    2)队列非空;

    front代表的是队列的第一个元素

    rear代表队的最后一个有效元素的下一个元素

    3)队列空front和rear的值相等,但不一定是零。

    循环队列入队伪算法:两步:

    1、将入队值存入r所指向的位置

    2、将r指向下一个位置

    错误写法:r=r+1;

    正确写法:r=(r+1)%数组长度,实现r的循环

    循环对列出队伪算法:一步:

    f=(f+1)%数组长度

    如何判断循环队列为空?如果f与r相等,则该队列为空。

    如何判断循环队列已满:

    两个方法:

    1、增加一个表示队列内元素个数的参数;

    2、队列少用一个元素,即长度为N的队列,只能放N-1个元素,if (r+1)%数组长度 == f 则队列满。

    队列主要算法:

    出队

    入队

    队列的具体应用:

    所有和时间有关的操作都与队列有关

    ////////////////////////////////////////////////////////////////////////

    ///程序示例

    #include

    #include

    #include

    typedef struct Queue{

    int * pBase;

    int front;

    int rear;

    }QUEUE, * PQUEUE;

    void init_queue(PQUEUE pq);

    bool en_queue(PQUEUE pq,int val);

    bool isFull(PQUEUE pq);

    void traverse_queue(PQUEUE pq);

    bool isEempty(PQUEUE pq);

    bool out_queue(PQUEUE pq,int * val);

    int main(void)

    {

    int outval;

    QUEUE q;

    init_queue(&q);

    en_queue(&q,11);

    en_queue(&q,13);

    en_queue(&q,15);

    en_queue(&q,17);

    en_queue(&q,19);

    en_queue(&q,21);

    en_queue(&q,24);

    traverse_queue(&q);

    if(out_queue(&q,&outval))

    {

    小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    printf("out queue success!the out value is %d ",outval);

    }

    else

    {

    printf("out queue failed! ");

    }

    traverse_queue(&q);

    en_queue(&q,24);

    traverse_queue(&q);

    out_queue(&q,&outval);

    traverse_queue(&q);

    out_queue(&q,&outval);

    traverse_queue(&q);

    out_queue(&q,&outval);

    traverse_queue(&q);

    out_queue(&q,&outval);

    traverse_queue(&q);

    out_queue(&q,&outval);

    traverse_queue(&q);

    out_queue(&q,&outval);

    traverse_queue(&q);

    out_queue(&q,&outval);

    return 0;

    }

    void init_queue(PQUEUE pq)

    {

    pq->pBase = (int *)malloc(sizeof(int) * 6);

    pq->front = 0;

    pq->rear = 0;

    }

    bool isFull(PQUEUE pq)

    {

    if((pq->rear + 1)%6 == pq->front)

    return true;

    else

    return false;

    }

    bool isEmpty(PQUEUE pq)

    {

    if(pq->front == pq->rear)

    return true;

    else

    return false;

    }

    bool en_queue(PQUEUE pq,int val)

    {

    if(isFull(pq))

    {

    printf("队列已满 ");

    return false;

    }

    else

    {

    pq->pBase[pq->rear] = val;

    pq->rear = (pq->rear +1)%6;

    return true;

    }

    }

    bool out_queue(PQUEUE pq,int * val)

    {

    if(isEmpty(pq))

    {

    printf("the queue is empty! ");

    return false;

    }

    * val = pq->pBase[pq->front];

    pq->front = (pq->front + 1)%6;

    return true;

    }

    void traverse_queue(PQUEUE pq)

    {

    int i = pq->front;

    while(i != pq->rear)

    {

    printf("%d ",pq->pBase[i]);

    i = (i + 1)%6;

    }

    printf(" ");

    }

    小编推荐一个学C语言/C++的学习裙【 六九九,四七零,五九六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

    ////////////////////////////////////////////////////////////////////////

    这些是C/C++能做的

    服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

    相关文章

      网友评论

      本文标题:C语言编程学习:线性结构的两种常见应用之二:队列

      本文链接:https://www.haomeiwen.com/subject/smamdftx.html