C语言程序员

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

2018-05-17  本文已影响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++能做的

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

上一篇下一篇

猜你喜欢

热点阅读