- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
递归函数执行过程的信息传递和控制转移可以用栈结构来实现。系统将整个程序运行时所需的空间安排在一个栈中,每当调用一个函数时,就为它在栈顶分配一个存储区,每当退出一个函数时,就释放它所占用的存储区,当前工作的函数的数据区总在栈顶。 例如,递归函数fact(4)的执行过程如图3.10所示,而图3.11表示求解4!时工作栈的变化。 3.3.1 队列的定义及其运算 队列也是一种运算受限的线性表。只允许在表的一端进行插入运算,而在另一端进行删除运算。允许插入(也称为入队)的一端称为队尾,允许删除(也称为出队)的一端称为队头,当队列中没有数据元素时称为空队列。 队列是一种与栈相反的结构。队列也称为先进先出的线性表,简称为FIFO表,如图3.12所示。队列的含义与现实生活中购物排队相似,先进入队列的成员总是先离开队列。 3.3 队列 通常,队列的基本运算有以下五种: (1)置空队setnull(q):设置一个队列q为空队列。 (2)判队列空empty(q):若队列q为空,则返回TRUE,否则返回FALSE。 (3)入队列enqueue(q,x):将数据元素x插入队列q的队尾。 (4)出队列delqueue(q):若队列q非空,删除队列的队头元素,并返回该队头元素。 (5)取队头元素getfront(q):若队列q 非空,则返回队头元素,否则返回空元素值。 3.3.2 队列的顺序存储结构 队列的顺序存储结构称为顺序队列。与顺序表类似,队列的顺序存储结构也是利用一个向量空间来存放当前队列中的元素。一般的,队列需设置两个指针分别指示当前队头元素和队尾元素。为了方便运算,可约定队尾指针指示当前队尾元素在队列中的实际位置,而队头指针指示当前队头元素的前一个位置。 顺序队列的类型定义如下: typedef struct {datatype queue[MAXSIZE]; /*MAXSIZE为队列的最大长度*/ int front,rear; }sequeue; sequeue *sq; 顺序队基本运算的实现: (1)置空队 void setnull(sequeue *sq) {sq-front=-1; sq-rear=-1; } (2)入队 int enqueue(sequeue *sq,datatype x) { if (sq-rear= =MAXSIZE-1) return(FALSE); else {sq-queue[++sq-rear]=x; return(TRUE); } } (3)出队 datatype delqueue(sequeue *sq) { if(sq-front= =sq-rear) return(NULL); else return(sq-queue[++sq-front]); } 以上算法在入队运算中,由于队满条件的限制会产生 “假上溢”现象,即当前队列并没有满但会产生“上溢”。如图3.13所示。 为了更好地解决“假上溢” 问题,可以将顺序队列设想为一个首尾相接的圆环,称为循环向量,队列称为循环队列,如图3.14所示。此时,可以克服“假溢出”现象。 队尾指针加1的运算在循环意义下可描述为: if(sq-rear+1= =MAXSIZE) sq-rear=0; else sq-rear++; 也可以利用利用数学上的求模运算描述为: sq-rear=(sq-rear+1) % MAXSIZE 同样,出队运算时,在循环意义下的队头指针加1运算可描述为: sq-front=(sq-front+1) % MAXSIZE 但在利用循环队列时会出现队空和队满两种不同的状态无法区别的情形,如图3.14(b)和(c),利用等式sq-front=sq-rear都可以表示队空和队满两种不同的状态。 一般的,可利用以下两种方法解决这个问题: (1)设置一个区别队列满与队列空的标
文档评论(0)