第3章 栈和队列34255.ppt

基本运算在循环队列上的实现 出队: Status DeQueue_Sq(SqQueue Q , ElemType e) { //循环队列Q出队,出队元素赋值给e中 if(Q.rear = = Q.front) return ERROR; e = Q.base[Q.front]; Q.front = (Q.front+1)%MAXQSIZE; return OK; }// DeQueue_Sq 3.4.2 队列的表示与实现 基本运算在循环队列上的实现 求队列长度: int QueueLength_Sq(SqQueue Q) { //返回队列Q的长度 return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; } //QueueLength_Sq 3.4.2 队列的表示与实现 注意:空的和满的队列的rear和front都是相邻的,有何办法区分队列是空还是满? 循环队列 (Circular Queue) 实现方法二 Circular Implementation of Queues in C++ Class definition: Circular Implementation of Queues in C++ (实现方法二) Initialization: Basic Queue Methods 链队列 typedef struct QNode{ ElemType data; struct Qnode *next; }QNode,*QueuePtr; typdef struct{ QueuePtr front,rear; }LinkQueue; Q.front指向头结点 Q.rear 指向最后一个结点 队空:Q.front 等于Q.rear 3.4.2 队列的表示与实现 ∧ q.front q.rear 队空 a1 a2 an ∧ …… q.front q.rear 链队列 3.4.2 队列的表示与实现 基本运算在链队列上的实现 入队: Status EnQueue_L(SqQueue Q , ElemType e) { //将数据元素e入链队列Q中 p = (QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW); p-data = e; p-next = NULL; Q.rear-next = p; Q.rear = p; return OK; }// EnQueue_L 3.4.2 队列的表示与实现 基本运算在循环队列上的实现 出队: Status DeQueue_L(SqQueue Q , ElemType e) { //链队列Q出队,出队元素赋值给e中 if(Q.front = = Q.rear) return ERROR; p = Q.front-next; e = p-data; Q.front-next = p-next; if(Q.rear == p) Q.rear = Q.front; //只有一个结点的情况 free(p); return OK; }// DeQueue_L 3.4.2 队列的表示与实现 作业 3.27 3.28 3.33 递归调用是直接或间接地自己调用自己。我们不妨把它看成是调用自身代码的复制件,因而其内部实现机理与普通多函数嵌套调用大致相同。 §3.3 栈与递归的实现 P(3) ① ② 调P(2) ③ printf(3) ④ 调P(2) P(2) ① ② 调P(1) ③ printf(2) ④ 调P(1) P(1) ① ② 调P(0) ③ printf(1) ④ 调P(0) P(0) ① return P(0) ① return P(1) ① ② 调P(0) ③ printf(1) ④ 调P(0) P(0) ① return P(0) ① return P(2) ① ② 调P(1) ③ printf(2) ④ 调P(1) void P( int w ) { ① if (w==0) return; ② P(w-1); ③ printf( “%d”, w); ④ P(w-1); } 输出序列: 1 2 1 3 1 2 1 举例:一个递归函数的执行过程 举例:Fib函数 0 n=0 Fib(n)= 1 n=1 Fib(n-1) + Fib(n-2)

文档评论(0)

1亿VIP精品文档

相关文档