数据结构3PPT文档格式.ppt
- 文档编号:13179556
- 上传时间:2022-10-07
- 格式:PPT
- 页数:115
- 大小:2.28MB
数据结构3PPT文档格式.ppt
《数据结构3PPT文档格式.ppt》由会员分享,可在线阅读,更多相关《数据结构3PPT文档格式.ppt(115页珍藏版)》请在冰豆网上搜索。
,2022年10月7日,#defineMAXSIZE100typedefstructSElemType*base;
SElemType*top;
intstacksize;
SqStack;
顺序栈的表示,2022年10月7日,构造一个空栈步骤:
(1)分配空间并检查空间是否分配失败,若失败则返回错误,顺序栈初始化,s,
(2)设置栈底和栈顶指针S.top=S.base;
(3)设置栈大小,2022年10月7日,StatusInitStack(SqStack,顺序栈初始化,2022年10月7日,判断顺序栈是否为空,boolStackEmpty(SqStackS)if(S.top=S.base)returntrue;
elsereturnfalse;
2022年10月7日,求顺序栈的长度,intStackLength(SqStackS)returnS.topS.base;
2022年10月7日,StatusClearStack(SqStackS)if(S.base)S.top=S.base;
returnOK;
清空顺序栈,2022年10月7日,StatusDestroyStack(SqStack,销毁顺序栈,2022年10月7日,
(1)判断是否栈满,若满则出错
(2)元素e压入栈顶(3)栈顶指针加1,顺序栈进栈,StatusPush(SqStack,*S.top=e;
S.top+;
2022年10月7日,
(1)判断是否栈空,若空则出错
(2)获取栈顶元素e(3)栈顶指针减1,顺序栈出栈,StatusPop(SqStack,-S.top;
e=*S.top;
2022年10月7日,判断是否空栈,若空则返回错误否则通过栈顶指针获取栈顶元素,取顺序栈栈顶元素,StatusGetTop(SqStackS,SElemType,e=*(S.top-);
?
2022年10月7日,435612中到了12顺序不能实现;
135426可以实现。
1.如果一个栈的输入序列为123456,能否得到435612和135426的出栈序列?
练习,2022年10月7日,练习,in-in-i+1不确定,2.若已知一个栈的入栈序列是1,2,3,n,其输出序列为p1,p2,p3,pn,若p1=n,则pi为,2022年10月7日,练习,top不变top=0top+top-,D,3.在一个具有n个单元的顺序栈中,假设以地址高端作为栈底,以top作为栈顶指针,则当作进栈处理时,top的变化为,2022年10月7日,考研试题,双栈共享一个栈空间,优点:
互相调剂,灵活性强,减少溢出机会,2022年10月7日,将编号为0和1的两个栈存放于一个数组空间Vm中,栈底分别处于数组的两端。
当第0号栈的栈顶指针top0等于-1时该栈为空,当第1号栈的栈顶指针top1等于m时该栈为空。
两个栈均从两端向中间增长(如下图所示)。
考研试题,2022年10月7日,typedefstructinttop2,bot2;
/栈顶和栈底指针SElemType*V;
/栈数组intm;
/栈最大可容纳元素个数DblStack;
数据结构定义如下,考研试题,2022年10月7日,voidDblpush(DblStack&
s,SElemTypex,inti);
/把x插入到栈i的栈intDblpop(DblStack&
s,inti,SElemType&
x);
/退掉位于栈i栈顶的元素intIsEmpty(DblStacks,inti);
/判栈i空否,空返回1,否则返回0intIsFull(DblStacks);
/判栈满否,满返回1,否则返回0,试编写判断栈空、栈满、进栈和出栈四个算法的函数(函数定义方式如下),考研试题,2022年10月7日,栈空:
topi=botii表示栈的编号栈满:
top0+1=top1或top1-1=top0,提示,2022年10月7日,链栈的表示,运算是受限的单链表,只能在链表头部进行操作,故没有必要附加头结点。
栈顶指针就是链表的头指针,typedefstructStackNodeSElemTypedata;
structStackNode*next;
StackNode,*LinkStack;
LinkStackS;
2022年10月7日,链栈的初始化,voidInitStack(LinkStack,2022年10月7日,判断链栈是否为空,StatusStackEmpty(LinkStackS)if(S=NULL)returnTRUE;
elsereturnFALSE;
2022年10月7日,链栈进栈,StatusPush(LinkStack,2022年10月7日,链栈进栈,e,StatusPush(LinkStack,2022年10月7日,链栈进栈,e,StatusPush(LinkStack,2022年10月7日,链栈进栈,e,S,StatusPush(LinkStack,2022年10月7日,链栈出栈,e=A,StatusPop(LinkStack,2022年10月7日,链栈出栈,e=A,p,StatusPop(LinkStack,2022年10月7日,链栈出栈,e=A,p,S,StatusPop(LinkStack,2022年10月7日,链栈出栈,StatusPop(LinkStack,e=A,S,2022年10月7日,取链栈栈顶元素,SElemTypeGetTop(LinkStackS)if(S=NULL)exit
(1);
elsereturnSdata;
2022年10月7日,3.2栈的应用,例1:
数制转换(十转N)用栈暂存低位值例2:
括号匹配的检验用栈暂存左括号例3:
表达式求值用栈暂存运算符例4:
迷宫求解用栈实现递归调用,简化了程序设计的问题,2022年10月7日,迷宫求解,2022年10月7日,从入口出发,按某一方向向未走过的前方探索若能走通,则到达新点,否则试探下一方向;
若所有的方向均没有通路,则沿原路返回前一点,换下一个方向再继续试探直到所有可能的通路都探索到,或找到一条通路,或无路可走又返回到入口点。
求解思想:
回溯法,迷宫求解,2022年10月7日,需要解决的问题:
1、表示迷宫的数据结构2、试探方向3、栈的设计4、防止重复到达某点,避免发生死循环,迷宫求解,2022年10月7日,1、表示迷宫的数据结构表示一个m行n列迷宫:
用mazemn表示,0im,0jnmazeij=0通路mazeij=1不通改进:
用mazem+2n+2表示且mazeij=1,i=0或m1,j=0或n1入口坐标为(1,1),出口坐标为(m,n),迷宫求解,2022年10月7日,北京林业大学信息学院,2022年10月7日,迷宫的定义:
#definem8/*迷宫的实际行*/#definen8/*迷宫的实际列*/intmazem+2n+2;
2、试探方向表示位置的类型PosType定义如下:
typedefstructintx,y;
PosType;
迷宫求解,2022年10月7日,试探顺序规定为:
从正东沿顺时针方向,与点(x,y)相邻的4个点及坐标,(x,y),(x,y+1),(x,y-1),(x+1,y),(x-1,y),迷宫求解,2022年10月7日,3、栈的设计栈中每个元素的组成:
通道块在路径上的序号坐标位置前进方向(东为1,南为2,西为3,北为4)栈元素的类型定义:
typedefstructintord;
PosTypeseat;
intdi;
SElemType;
迷宫求解,2022年10月7日,4、防止重复到达某点走过不通之处要加以标记(MarkPrint操作)迷宫求解算法思想及算法参见P51,迷宫求解,2022年10月7日,表达式求值,算术四则运算规则,
(1)先乘除,后加减,
(2)从左算到右,(3)先括号内,后括号外,2022年10月7日,表达式,2022年10月7日,=,x,=,x,x,表3.1算符间的优先关系,2022年10月7日,【算法思想】,
(1)初始化OPTR栈和OPND栈,将“#”压入OPTR
(2)依次读入字符ch,循环执行(3)至(5)(3)取出OPTR的栈顶元素,当OPTR的栈顶元素和ch均为“#”时,表达式求值完毕,OPND栈顶元素为表达式的值,设定两栈:
OPND-操作数或运算结果OPTR-运算符,(4)if(ch是操作数)则ch进OPND,读入下一字符ch,(5)else比较OPTR栈顶元素和ch的优先级,case:
运算符ch进OPTR,读入下一字符ch,case=:
脱括号(弹出左括号),读入下一字符ch,case:
栈顶运算符退栈、计算,结果进OPND,2022年10月7日,北京林业大学信息学院,OperandTypeEvaluateExpression()InitStack(OPND);
ch=getchar();
while(ch!
=#|GetTop(OPTR)!
=#)if(!
In(ch,OP)Push(OPND,ch);
/ch不是运算符则进栈elseswitch(Precede(GetTop(OPTR),ch)/比较优先权case:
/弹出OPTR栈顶的运算符运算,并将运算结果入栈Pop(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b);
break;
case=:
/脱括号并接收下一字符Pop(OPTR,x);
/switch/whilereturnGetTop(OPND);
/EvaluateExpression,2022年10月7日,2022年10月7日,3.3栈与递归,递归的定义若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的;
若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。
2022年10月7日,栈,2022年10月7日,以下三种情况常常用到递归方法递归定义的数学函数具有递归特性的数据结构可递归求解的问题,2022年10月7日,1.递归定义的数学函数:
阶乘函数:
2阶Fibonaci数列:
2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构
![提示](https://static.bdocx.com/images/bang_tan.gif)