DS03_栈和队列.ppt

  1. 1、本文档共70页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
; ; ; ; ; ; ;⑶入栈 Push(S,x) int Push_SeqStack(SeqStack *s,DataType x) { if(s-top==MaxSize-1) { printf(\n Stack is full!); return 0; } s-top++; s-data[s-top]=x; return 1; }; ; ⑸取栈顶元素GetTop(S,x) ; ; ; (2)两个栈共享存储单元的出栈算法; ; ; ; ; ③压栈运算 ; ; ;例3-1:数制转换问题(辗转相除法,十进制数转r进制) 算法分析: 算法的原理:N=(N/r)*r + N%r (N为十进制数,r为其他进制) 算法:设置一个顺序栈 : 本算法包含(InitStack( ), Push_SeqStack( ) , Pop_SeqStack( ),Eampty_SeqStack( ) , (利用栈的“后进先出”) ;Void conversion (int N, int r) { SeqStack *s; int x; s=Initstack (s); While(N!=0) { Push_SeqStack(s, (N%r)) N=N/r; /*转换算法核心*/ } While(! Empty_SeqStack(s)) { Pop_SeqStack(s, x); printf(“%d”,x); } };例3-2:利用栈实现迷宫的求解; 求迷宫中从入口到出口的所有路径,所求路径必须是简单路径,即某一位置不能重复走两遍。 求解思想:使用回溯法,即从入口出发,按某一方向向前探索,若能走通(未走过的),则到达新点,否则试探下一方向;若所有的方向均没有通路,则沿原路返回前一点,换下一个方向再继续试探,直到所有可能的通路都探索到,或找到一条通路,或无路可走又返回到入口点。 在求解过程中,为了保证无路可行时,能沿原路返回前一点以便继续下一个方向向前试探,则需要用一个栈来保存所能够到达的每一点的坐标及从该点前进的方向。 ;需要解决的四个问题: (1)表示迷宫的数据结构 设迷宫为m行n列,利用maze[m+2][n+2] 来表示一个带围墙的迷宫。maze[i][j]=0或1,其中0表示通道,1表示墙(不通)。迷宫四周为围墙,因此值全部为1。迷宫可定义如下: #define M 6 //迷宫的实际行 #define N 8 //迷宫的实际列 int maze [M+2][N+2] ; ;(2)试探方向 对于迷宫的每个点,有8个方向可以试探。; 从正东开始沿顺时针进行的这8个方向的坐标增量,放在一个结构体数组move [ 8 ]中,在move 数组中,每个元素由两个域组成,x:横坐标增量,y:纵坐标增量。move数组为 : typedef struct { int x, y ; } item ; item move[8] ;;(3)栈的设计 当到达了某点而无路可走时,需返回前一点,再从前一点开始向下一个方向继续试探。因此,压入栈栈中的不仅是顺序到达的各点的坐标,而且还要有从前一点到达本点的方向序号。栈中元素是一个由行、列、方向组成的三元组,栈中元素的类型定义如下: #define MAXSIZE 100 typedef struct { int x , y , d ; } DataType ; typedef struct stack {   DataType elem[MAXSIZE]; //存栈顺序表 int top;   //栈顶下标  } SQSTACK; SQSTACK s ; //栈的定义;(4)标志已走过的坐标 为防止重复到达某点,以避免发生死循环,一种方法是另外设置一个标志数组mark[m][n],它的所有元素都初始化为0,一旦到达了某一点 ( i , j )后,使mark[i][j] 置1,下次再试探这个位置时就不能再走了;另一种方法是当到达某点(i , j)后,使maze[i][j] 置 -1,以便区别未到达过的点,同样也能起到防止走重复点的目的。 这里使用后一种方法。 ;int mazepath (int

文档评论(0)

baobei + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档