三章栈和队列.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《三章栈和队列.ppt》由会员分享,可在线阅读,更多相关《三章栈和队列.ppt(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、三章栈和队列 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望 栈栈:在表的某一端进行插入和删除操作的 线性表。特点:后进先出 抽象数据数据类型的定义:ADT Stack 数据对象:D=ai|aiElemSet,i=1,2,n,n=0 数据关系:R1=|ai-1,aiD,i=2,n 约定an端为栈顶,a1端为栈底栈的示意图:a1a2:an栈顶栈底进栈 栈顶栈底出栈a2:a1an栈顶栈顶栈顶栈顶栈顶栈顶栈顶栈顶基本操作:InitStack(&s)操作结果:构造一个空栈
2、S DestroyStack(&s)初始条件:栈S已存在操作结果:栈S被销毁 ClearStack(&s)初始条件:栈S已存在操作结果:将S清为空栈 StackEmpty(s)初始条件:栈S已存在操作结果:若栈为空栈,则返回TRUE,否则FALSE StackLength(s)初始条件:栈S已存在操作结果:返回S的元素个数,即栈的长度 GetTop(S,&e)初始条件:栈S已存在且非空操作结果:用e返回s的栈顶元素 Push(&s,e)初始条件:栈S已存在操作结果:插入元素e为新的栈顶元素Pop(&s,&e)初始条件:栈S已存在且非空操作结果:删除s的栈顶元素,并用e返回其值StackTrav
3、erse(S,visit()初始条件:栈S已存在且非空操作结果:从栈底到栈顶依次对s的每个数据元素调用函 数visit()。一旦visit()失败,则操作失败ADT Stack二:栈的表示与实现栈的存储结构(两种)顺序存储结构 链式存储结构1.顺序存储结构:利用一组地址连续的存储单元 依次存放自栈底到栈顶的数据 元素结构描述:typedef struct SElemType *base;SElemType *top;int stacksize;SqStack;图示:AEDCBABAtopbasebasetoptopbasetopbase栈顶指针和栈中元素之间的关系规定:top指针指向下一个元素
4、进栈的位置空栈条件:S.top=S.base栈满条件:S.top-S.base=S.stacksize入栈:top指针增加1出栈:top指针减1栈的顺序存储表示:#define STACK_INIT_SIZE 100;/存储空间初始分配量#define STACKINCREMENT 10;/存储空间分配增量 Typedef struct SElemType *base;/在栈构造之前和销毁之后,base的值为NULL SElemType *top;/栈顶指针 int stacksize;/当前已分配的存储空间,以元素为单位SqStack;基本操作的函数原型:Status InitStack(S
5、qStack&s);/构造一个空栈SStatus DestroyStack(SqStack&s);/销毁栈S,S不再存在Status ClearStack(SqStack&s);/把S置为空栈Status StacjEmpty(SqStack s);/若栈S为空栈,则返回TRUE,否则返回FALSEInt StackLength(SqStack s);返回S的元素个数,即栈的长度StatusGetTop(SqStack s,SElemType&e);/若栈 不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORStatus PUSH(SqStack&s,SElemType&e);/插入
6、元素e为新的栈顶元素Status POP(SqStack&s,SElemType&e);/若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORStatus StackTraverse(SqStack&s,Status(*visit)();/从栈底到栈顶依次对栈中的每个元素调用函数visit()。一旦visit()失败,则操作失败/-基本操作的算法描述(部分)-Status InitStack(SqStack&s)/构造一个空栈SS.base=(SElemType*)malloc(STACK_INIT-SIZE*sizeof(Elemtype);If(!S.base)exi
7、t(OVERFLOW);/存储分配失败S.top=S.base;S.stacksize=STACK _INIT-SIZE;Return OK;/InitStackStatusGetTop(SqStack s,SElemType&e)/若栈 不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR if(S.top=S.base)return ERROR;e=*(S.top-1);return OK;/GetTopStatus PUSH(SqStack&s,SElemType&e)/插入元素e为新的栈顶元素 if(S.top-s.base=s.stacksize)/栈满,追加存储空间 S.
8、base=(ElemType*)realloc(s.base,(s.stacksize+CREMENT)*sizeof(elemtype);If(!S.base)exit(OVERFLOW);/存储分配失败s.top=s.base+S.stacksize;s.stacksize+=STACKINCREMENT;*S.top+=e;Return OK;/PushStatus POP(SqStack&s,SElemType&e);/若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top=S.base)return ERROR;e=*-s.top;return
9、OK;/Pop栈的链式存储结构:结构与链表结构相同入栈:在表首插入一个结点出栈:删除表首结点链栈示意图:如右图data next栈顶栈底S 栈的应用举例数制转换十进制数N和其它d进制的转换原理:N=(N div d)d+N mod d(其中:div为整除运算,mod 为求余运算例:(1348)10=(2504)8,其运算过程如下:N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 2算法:void conversion()/对于输入的任意一个非负十进制整数,打印输出与其等值的八进制 InitStack(s);/构造空栈 scanf(“%d”,N);
10、While(N)push(s,n%8);N=N/8;While(!StackEmpty)pop(s,e);printf(“%d”,e);/conversion括号匹配的检验:设表达式中只有,()思想:利用栈解决,依次输入表达式每一个字符,若是左括号,将其入栈,若是右括号,则出栈左括号与其匹配,循环执行,直到表达式输入结束。行编辑程序思想:设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出错,并在发现有误时及时更正算法:Void LinEdit()/利用字符栈S,从终端接收一行并传送至调用过程的数据区InitStack(S);/Ch=getchar();/从终
11、端接收第一个字符While(ch!=EOF)/EOF 为全文结束符 while(ch!=EOF&ch!=n)switch(ch)case#:Pop(s,c);break;/仅当栈非空时退栈 case:ClearStack(s);break;/重置S为空栈 default:push(S,ch);break;/有效字符进栈,未考虑栈满情况 ch=getchar();/从终端接收下一个字符 将从栈底到栈顶的栈内字符传送至调用过程的数据区;ClearStack(S);/重置S为空栈 if(ch!=EOF)ch=getchar();DestroyStack(S);/LineEdit表达式求值表达式组成:
12、操作符(常量,变量);运算符(+,-,,);界限符((),#,结束符);运算规则:先乘除,后加减;从左算到右 先括号内,后括号外,算符优先 为实现算符优先算法,使用两个工作栈。一个称为OPTR,用以寄存运算符;另一个为OPND,用以寄存操作数或运算结果。算法思想:首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕。得到表达式结束在OPND栈中相应操作有三种情况:栈顶运算符输入运算符,从OPND栈中出两个操作运算符出栈,对栈顶运算符进行运算,将结果入OP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 三章栈 队列
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内