(3)--lecture3数据结构数据结构.ppt
《(3)--lecture3数据结构数据结构.ppt》由会员分享,可在线阅读,更多相关《(3)--lecture3数据结构数据结构.ppt(127页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第第3章章栈和队栈和队列列 栈栈和和队队列是列是对线对线性表的某些操作加以限定而派生出性表的某些操作加以限定而派生出的的结结构。它构。它们们的操作本身并不的操作本身并不难难掌握,掌握,难难点是理解点是理解栈栈和和队队列的列的应应用思想、掌握其算法的用思想、掌握其算法的设计设计技巧。技巧。2 通常称,栈和队列是限定插入插入和删除除只只能能在表的“端点端点”进行的线性表。线性表性表 栈 队列列Insert(L,i,x)Insert(S,n+1,x)Insert(Q,n+1,x)1in+1 Delete(L,i)Delete(S,n)Delete(Q,1)1in栈和队列是两种常用的数据类型3v 3
2、.1 栈v 3.2 栈的的应用用举例例v 3.3 队列列v 3.4 队列列应用用举例例43.1 栈栈一、一、栈的的结构特点和操作构特点和操作二、二、栈的表示和操作的的表示和操作的实现5一、一、栈的的结构特点和操作构特点和操作6栈栈(Stack)的定义的定义a2a1a4a3栈底底栈顶 栈(stack)是限定只能在表的一端进行插入和删除的线性表。在栈中,允许插入和删除的一端称为“栈顶”(top),不允许插入和删除的一端称为“栈底底”(bottom)。7InitStack(&S)DestroyStack(&S)ClearStack(&S)StackEmpty(s)StackLength(S)GetT
3、op(S,&e)Push(&S,e)Pop(&S,&e)StackTravers(S)栈的的基本操作:基本操作:8InitStack(&S)操作结果:构造一个空栈 S。DestroyStack(&S)初始条件:栈 S 已存在。操作结果:栈 S 被销毁。9 StackEmpty(S)初始条件:栈 S 已存在操作结果:若栈 S 为空栈,则返回 TRUE,否则 FALE。10 StackLength(S)初始条件:栈 S 已存在。操作结果:返回 S 的元素个数,即栈的长度。11 GetTop(S,&e)初始条件:栈 S 已存在且非空。操作结果:用 e 返回 S 的栈顶元素。a1a2an 12 Cle
4、arStack(&S)初始条件:栈 S 已存在。操作结果:将 S 清为空栈。13 Push(&S,e)初始条件:栈 S 已存在。操作结果:插入元素 e 为 新的栈顶元素。a1a2ane 14 Pop(&S,&e)初始条件:栈 S 已存在且非空。操作结果:删除 S 的栈顶元素,并用 e 返回其值。a1a2 anan-1 15v 顺序序栈v 链栈二、二、栈的表示和操作的的表示和操作的实现16v顺序序栈 类似于线性表的顺序表示法,指向表尾的指针可以作为栈顶指针。/-栈的顺序存储表示栈的顺序存储表示-#define STACK_INIT_SIZE 100;#define STACKINCREMENT
5、10;typedef struct SElemType *base;SElemType *top;int stacksize;SqStack;类似于似于线性表的性表的顺序映象序映象实现,指向表尾的指指向表尾的指针可以作可以作为栈顶指指针。Status InitStack(SqStack&S)/构造一个空构造一个空栈S S.base=(ElemType*)malloc(STACK_INIT_SIZE *sizeof(ElemType);if(!S.base)exit(OVERFLOW);/存存储分配失分配失败 S.top=S.base;S.stacksize=STACK_INIT_SIZE;re
6、turn OK;Status Push(SqStack&S,SElemType e)/若若栈不不满,则将元素将元素 e 插入插入栈顶,并返回,并返回 OK;/否否则返回返回 OVERFLOW if(S.top-S.base=S.stacksize)return OVERFLOW;else *S.top+=e;return OK;Status Pop(SqStack&S,SElemType&e)/若若栈不空,不空,则删除除S的的栈顶元素,元素,/用用 e 返回其返回其值,并返回,并返回OK;/否否则返回返回ERROR if(S.top=S.base)return ERROR;e=*-S.top;
7、return OK;21栈顶指指针a1an注意注意:链栈中中指指针的方向的方向an-1v链栈top223.2 栈的应用举例栈的应用举例 栈在算法设计中占有重要的地位,运用的技巧也性也较高,本节安排五个例子来讨论栈的使用。23例一例一 数制数制转换例二例二 括号匹配的括号匹配的检验例三例三 背包求解背包求解例六例六 表达式求表达式求值例七例七 递归函数的函数的实现例四例四 编辑文本文本例五例五 迷迷宫问题24例一、数制转换算法基于数制转换公式:算法基于数制转换公式:N=(N div d)d+N mod d 25例如:(1348)10=(2504)8 其运算过程如下:N N div 8 N mod
8、 8 1348 168 4 168 21 0 21 2 5 2 0 2计算算顺序序输出出顺序序26void conversion()1.InitStack(S);2.cin N;3.while(N)4.Push(S,N%8);5.N=N/8;6.7.while(!StackEmpty(S)8.Pop(S,e);9.cout 0&k=0)/第k件物品可以进栈4.Push(S,k);T=wk;5.6.k+;7.8.if(T=0)StackTraverse(S);/输出一个解9.Pop (S,k);T+=wk;/退出栈顶物品10.k+;11.while(!StackEmpty(S)|k-/(#nex
9、t=NULL;return OK;79 Status EnQueue_L(LinkQueue&Q,QElemType 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;80 Status DeQueue_L(LinkQueue&Q,QElemType&e)/若队列不空,则删除Q的队头元素,/用 e 返回其值,并返回TRUE;否则返回FALSE if(Q.front=Q.rear)return ERROR;p=Q.f
10、ront-next;e=p-data;Q.front-next=p-next;if(Q.rear=p)Q.rear=Q.front;free(p);return OK;#define MAXQSIZE 100 /最大最大队列列长度度 typedef struct QElemType *base;/动态分配存分配存储空空间 int front;/头指指针,若,若队列不空,列不空,/指向指向队列列头元素元素 int rear;/尾指尾指针,若,若队列不空,指向列不空,指向 /队列尾元素列尾元素 的下一个位置的下一个位置 SqQueue;循循环队列列顺序映象序映象82abc dQ.elemQ.fro
11、nteQ.rearQ.front:指向队头元素Q.rear:指向队尾下一元素队列的入队和出队操作:83e0 1 2 3 4 5 6 7Q.frontQ.rear初初态(空(空队):Q.frontQ.rear队空空:当头尾指针重合时:队为空840 1 2 3 4 5 6 7acbQ.frontQ.rear队满状态的约定:acbQ.rear0 1 2 3 4 5 6 7Q.rearQ.fronta b c defg假满真满Q.rearQ.rear队满时还富裕一个富裕一个单元的空元的空间以区以区别“队空空”和和“队满”的的条件条件8501234567abcQ.rearQ.frontQ.reard循循
12、环队列列(按循环机制使用顺序空间)front和和rear都按都按逆逆时针操作操作86Q.rear=(Q.rear+1)Q.front=(Q.front+1)通过头尾指针的循环使用,顺序空间即可当循环空间来使用,称循环队。循环使用指针在技术上是由取模实现的:%MAXQSIZE;%MAXQSIZE;Status InitQueue(SqQueue&Q)/构造一个空构造一个空队列列Q Q.base=(ElemType*)malloc (MAXQSIZE*sizeof(ElemType);if(!Q.base)exit(OVERFLOW);/存存储分配失分配失败 Q.front=Q.rear=0;re
13、turn OK;Status EnQueue(SqQueue&Q,ElemType e)/插入元素插入元素e为Q的新的的新的队尾元素尾元素 if(Q.rear+1)%MAXQSIZE=Q.front)return ERROR;/队列列满 Q.baseQ.rear=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;Status DeQueue(SqQueue&Q,ElemType&e)/若若队列不空,列不空,则删除除Q的的队头元素,元素,/用用e返回其返回其值,并返回,并返回OK;否否则返回返回ERROR if(Q.front=Q.rear)return ERROR;
14、e=Q.baseQ.front;Q.front=(Q.front+1)%MAXQSIZE;return OK;903.4 队列的应用举例队列的应用举例利用循利用循环队列求列求二二项式系数式系数(杨辉三角)三角)91第第 1 行行 1 1第第 2 行行 1 2 1 第第 3 行行 1 3 3 1第第 4 行行 1 4 6 4 1二二项式系数式系数值(杨辉三角)三角)设第 i-1行的值:(a0=0)a1.ai(ai+1=0)则第 i 行的值:bj=aj-1+aj,j=1,2,i+100循循环队列使用例列使用例921 3 3 100 1 4 6 4 1展转相加求二项式系数0利用循环队列可以在有限的空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lecture3 数据结构
限制150内