📄 csdn_文档中心_学习队列.htm
字号:
</SCRIPT>
</B> </TD></TR>
<TR bgColor=#999999>
<TD colSpan=3 height=1></TD></TR></TBODY></TABLE>
<TABLE border=0 width=770>
<TBODY>
<TR>
<TD align=middle bgColor=#fafafa class=td1 vAlign=top width=150><BR>
<SCRIPT src="CSDN_文档中心_学习队列.files/other.js"></SCRIPT>
</TD>
<TD align=middle width=620>
<TABLE bgColor=#eeeeee border=0 cellPadding=0 cellSpacing=0 width=600>
<TBODY>
<TR bgColor=#ffffff>
<TD align=middle height=10 width=50></TD>
<TD align=right><A href="http://www.csdn.net/">CSDN</A> - <A
href="http://www.csdn.net/develop/">文档中心</A> - <FONT
color=#003399>其他开发语言 </FONT> </TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399 height=10><FONT
color=#ffffff>标题</FONT></TD>
<TD><B> 学习队列</B> rerli(原作)
</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399><FONT color=#ffffff>关键字</FONT></TD>
<TD width=500> 队列</TD></TR>
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
<TABLE border=0 width=600>
<TBODY>
<TR>
<TD align=left><BR>
<P> </P>
<P>/*<BR>=====================================================================<BR>作者:rerli<BR>时间:2004-02-11<BR>目的:学习队列<BR>=====================================================================<BR>*/<BR>/*<BR> 队列是从日常排队现象抽象出来的一种数学模型。当然数据结构中的队列<BR>远没有生活中的排队灵活。数据结构中的队列规定:数据只能从队尾进,从队<BR>首出来。已经进入队列的数据次序不能再做改变。这就叫做“先进先出”(FIFO)<BR>或者说“后进后出”(LILO)。允许插入的一端称为队尾,通常用一个称为尾指针<BR>(rear)的指针指向队尾元素,即尾指针总是指向最后被插入的元素;允许删<BR>除的一端称为队首,通常也用一个队首指针(front)指向队首元素的前一个位<BR>置(当然也可以直接指向队首元素,只是许多数据结构的书上都习惯这么定义)。</P>
<P> 与队列类似,我们可以用一维数组来模拟队列这种数据结构,也可以用链表<BR>来模拟。</P>
<P> 根据以上描述,队列可以整理出以下基本操作:<BR> 1、创建初始化:按约定置队列为空状态。<BR> 2、入队列:在队尾加入一个新数据项。<BR> 3、出队列:从队首取出一个数据项,并使余下诸项向队首移动。<BR> 4、队列空:判断队列是否为空。<BR> 5、队列满:判断队列是否已满。<BR>
从概念上说,队列不存在“满”状态,其长度可以任意增加,<BR>
但实现(不论静态或动态)中总有空间限制的。</P>
<P> 下面我就来讨论用数组实现队列结构。</P>
<P> 假定队列中元素的类型为T,队列的最大长度为queue_size,在任何一刻队列<BR>首、尾位置分别用下标head、tail指向。</P>
<P> 队列初始状态应为:head=0,tail=-1。根据队列定义,head值应恒为0,<BR>那么每当出队一个数据项,则必须执行多次移动操作(余下诸项向队首移动)。<BR>显然不能直接采用这种结构实现队列。解决这个问题,可以从数学取模运算联想<BR>到一个解决办法。比如x=(x+1)
mod 100
,则x的变化范围在[0,99]之间,<BR>超过100的又从0,1开始。这不就是我们所需要的嘛!许多书上把它叫作“循环<BR>数组”技术。即当入队列时先移动tail(即tail=(tail+1)
mod queue_size),<BR>出队列时先移动head(即head=(head+1) mod queue_size)。</P>
<P> 在移动中,若head(或tail)值为queue_size-1,则移动后head(或tail)的值<BR>就变成0了,对这种特征就是一个环,只要数组有空间,就可以入队列。</P>
<P> 用“循环数组”实现队列,必须注意怎样判断队列的空与满的状态。除起始状态<BR>外。任何时刻tail所指为最后一个进入队列的元素,而head所指的是刚刚出队列的<BR>那个元素原先所占的位置。因此(head+1)
mod queue_size才是真正当前队列中首元<BR>素位置。</P>
<P> 采用条件:(tail+1) mod queue_size == head
作为“队列满”的判断条件。<BR>实际上此时队列中还有一个空位置,这样队列的利用空间比定义的最大空间少一个<BR>单元。假如把这个单元也利用上,则就不好判断“满”或“空”了(当head==tail)<BR>,必须根据是tail追上了head,还是head追上了tail才能区分,这样给处理带来了<BR>不便。</P>
<P>*/<BR>#include <stdlib.h><BR>#include
<stdio.h><BR>#define NULL 0</P>
<P>typedef struct node<BR>{<BR> int data; <BR>}NODE;</P>
<P>#define LEN sizeof(NODE)</P>
<P>/*队列的需要变量*/<BR>typedef enum
{false,true}bool; /*定义bool类型*/<BR>unsigned int
head; /*定义队首下标变量*/<BR>unsigned int
tail; /*定义队尾下标变量*/<BR>static NODE
*queue=NULL; /*定义一个队列*/<BR>static unsigned int
queue_size=0;/*队列的大小*/</P>
<P>/*<BR>========================<BR> 功能:初始化队列的大小<BR> 返回:true
or false<BR>========================<BR>*/<BR>bool
InitQueue(unsigned int size)<BR>{<BR> queue=(NODE
*)malloc(size*LEN); /*开辟空间*/
<BR> if
(queue==NULL) /*开辟空间失败,则返回false*/<BR> {<BR> return
false;<BR> }<BR> queue_size =
size; /*保存队列空间大小值*/<BR> head =
queue_size-1;/*队首下标赋初值*/ <BR> tail =
queue_size-1;/*队尾下标赋初值*/ <BR> return
true; /*初始化成功,返回true*/<BR>}</P>
<P>/*<BR>======================<BR> 功能:释放队列的内存<BR> 返回:void<BR>======================<BR>*/<BR>void
FreeQueue()<BR>{<BR> free(queue);<BR> /*<BR>
注意:这一点很重要。free()之后并不能将queue<BR>
置为NULL,所以我们一定要自己做。这样能防止产生<BR>
“野指针”,即地址不确定的指针。<BR> */<BR> queue = NULL; <BR>}</P>
<P>/*<BR>==========================<BR> 功能:判断队列是否已满<BR> 返回:true
or false<BR>==========================<BR>*/<BR>bool
Full()<BR>{<BR> return (((tail+1)%queue_size)==head);<BR>}</P>
<P>/*<BR>===========================<BR> 功能:判断队列是否为空<BR> 返回:true
or false<BR>===========================<BR>*/<BR>bool
Empty(){<BR> <BR> return (head==tail);<BR>}</P>
<P>/*<BR>========================<BR> 功能:入队列<BR> 返回:true
or false<BR>========================<BR>*/<BR>bool Push(NODE
p)<BR>{<BR> if
(!Full()) /*队列不满,则入队列;队尾下标要加1*/<BR> {<BR> tail
= (tail+1)%queue_size;<BR> queue[tail] =
p;<BR> return
true;<BR> }<BR> else<BR> {<BR> printf("queue
is overflow !\n");<BR> return false;<BR> }<BR>}</P>
<P>/*<BR>===================<BR> 功能:出队列<BR> 返回:出队列元素指针<BR>===================<BR>*/<BR>NODE
*Pop()<BR>{<BR> if
(!Empty()) /*队列不空,则出队列;队首下标要加1*/<BR> {<BR> head
= (head+1)%queue_size;<BR> return
(&queue[head]);<BR> }<BR> else<BR> {<BR> printf("queue
is empty !\n");<BR> return NULL;<BR> }<BR>}</P>
<P>void main(void)<BR>{ <BR> NODE node1 =
{3};<BR> NODE *p;</P>
<P> if
(!InitQueue(3)) /*初始化不成功,则退出*/<BR> {<BR> exit(0);<BR> }<BR> Push(node1);<BR> /*去掉下面的注释,你可以验证讲解中空间利用问题*/<BR> /*<BR> Push(node1);<BR> Push(node1);<BR> Push(node1);<BR> */<BR> p
=Pop();<BR> printf("%d",p->data);</P>
<P> FreeQueue(); /*注意程序退出时释放队列内存*/</P>
<P> printf("\n");<BR> system("pause");<BR>}<BR></P><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0
width=770>
<TBODY>
<TR bgColor=#006699>
<TD align=middle bgColor=#006699 id=white><FONT
color=#ffffff>对该文的评论</FONT></TD>
<TD align=middle>
<SCRIPT src="CSDN_文档中心_学习队列.files/readnum.htm"></SCRIPT>
</TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1
width=770>
<TBODY>
<TR>
<TH bgColor=#006699 id=white><FONT
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
<TBODY>
<TR>
<TD>你没有登陆,无法发表评论。 请先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=24238">登陆</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>
<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
<TBODY>
<TR align=middle>
<TD height=10 vAlign=bottom><A
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A
href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A
href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
border=0 height=48 src="CSDN_文档中心_学习队列.files/biaoshi.gif"
width=40></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -