北大数据结构课讲义7.pptxVIP

  • 1
  • 0
  • 约4.72千字
  • 约 65页
  • 2020-06-12 发布于浙江
  • 举报
第四章 栈和队列 4.1 栈 4.2 栈的顺序存储结构和操作实现 4.3 栈的链接存储结构和操作实现 4.4 栈的简单应用举例 4.5 算术表达式的计算 4.6 栈与递归 4.7 队列;4.1 栈 栈的定义 栈(stack)又称堆栈,是限定只在表尾进行插入或删除操作的线性表。栈 S = ( a1, a2, …,an ) 是按a1, a2, …,an次序进栈的,a1为栈底元素,an为栈顶元素。 ;栈与递归 递归可使问题及求解步骤的描述变得简洁而清晰。特别是对于复杂问题,用递归方法分析描述,比较自然,利于理解。递归包括递归步骤和终止出口。 递归问题转化为非递归往往要用栈来实现,把在递归中用到的变量入栈出栈,如书上【习题4-4】之9,10;4.7 队列 队列是一种先进先出(FIFO)线性表。只允许在其一端删除元素,即队头(front),只允许在其另一端插入元素,即队尾(rear)。 ;图 4-10 顺序队列的插入和删除操作;; 初始时, 队列为空, 有 front=0 rear=0; 队列的静态数组一般是循环使用的。 为了判别队列满和队列空的指针状况,令front指向队首元素的前一个位置。 入队时需先修改入队指针(队尾指针) rear = = (rear +1)% QueueMaxSize 然后判断队列满的条件 (rear+1)% QueueMaxSize == front 最后将元素入队。 出队时先 判断队列空的条件 front == rear 然后修改队头指针 front == (front +1)% QueueMaxSize 最后将元素出队。;;在顺序队列中插入和删除,不需要比较和移动任何元素,只需修改队尾和队首指针,并向队尾写入元素或从队首取出元素 时间复杂度为:O(1) 若存储队列的数组的长度为N,则队列长度(即所含元素个数)为: (N+rear-front)%N;(2)队列的链式存储结构 struct LinkQueue { LNode* front; LNode* rear; }; struct LNode { ElmeType data; LNode* next; };;;在链队中插入和删除,不需要比较和移动任何元素,只需修改个别相关指针和进行结点的动态分配或回收操作 时间复杂度为:O(1);4.4.4 队列运算的实现 1. 队列运算在顺序存储结构上的实现 (1)初始化队列 void InitQueue(Queue Q) { Q.MaxSize=10; Q.queue=new ElemType[Q.MaxSiize]; Q.front=Q.rear=0; } ; (2)将队列清空,并释放动态存储空间 void ClearQueue(Queue Q) { if(Q.queue!=NULL) delete []Q.queue; Q.front=Q.rear=0; Q.queue=NULL; Q.MaxSize=0; } ;(3)检查队列是否为空 int QueueEmpty(Queue Q) { return Q.front==Q.rear; } (4)读取队头元素 //让front指针不是指向队首元素,而是指向它的前一个位置 即:队首元素是队首指针front的下一个位置中的元素 ElemType PeekQueue(Queue Q) { if(Q.front==Q.rear){ cerrQueue is Empty.endl; exit(1); } return Q.queue[(Q.front+1)%QueueMaxSize]; };(5)向队列插入新元素-1 void EnQueue(Queue Q, const ElemType item) { int k=(Q.rear+1)%QueueMaxSize;//队尾的下一位置 if(k==Q.front){ cerrQueue is overflow.endl; exit(1); } Q.rear=k; Q.queue[k]=item; };(5)向队列插入新元素-2 void EnQueue(queue Q, const ElemType item) { if((Q.rear+1)%QueueMaxSize==Q.front) { //扩大2倍的存储空间 int k=sizeof(ElemType); Q

文档评论(0)

1亿VIP精品文档

相关文档