第3章 栈和队列.ppt
《第3章 栈和队列.ppt》由会员分享,可在线阅读,更多相关《第3章 栈和队列.ppt(51页珍藏版)》请在麦多课文档分享上搜索。
1、第3章 栈和队列,北京师范大学 教育技术学院 杨开城,一、栈栈的定义,如果一个线性表的插入和删除操作只能在线性表的一端进行,而不能在其他位置上进行,那么这个线性表被称为栈(Stack)。 后进先出(Last In First Out)栈的操作包括: 初始化空栈 销毁栈 判断栈的空和满 入栈 出栈,一、栈顺序栈(1),顺序栈的数据类型定义如下: typedef struct stack_tag elemtype *elem; /*指向存放数据元素的内存块*/int top; /*栈顶标识,elemtop是栈顶元素*/int size; /*栈的容量*/SQSTACK;,一、栈顺序栈(2),1初始
2、化栈 int InitSqstack(SQSTACK *S, int n) /*初始化顺序栈,栈的容量是n。成功则返回1,否则返回0*/S-elem=(elemtype *)malloc(n*sizeof(elemtype); /*为数据元素分配内存*/if(S-elem=NULL)return 0; /*初始化失败*/S-size=n; /*设置栈的容量*/S-top=-1; /*设置栈为空栈*/return 1; 2销毁栈 void DestroySqstack(SQSTACK *S) /*释放栈所占有的内存*/free(S-elem); /*释放内存,并设置为NULL*/S-elem=N
3、ULL;S-top=-1;/*将其他成员设置成安全值*/S-size=0; ,一、栈顺序栈(3),3入栈 int Push(SQSTACK *S,elemtype e) /*在栈顶一端插入数据元素e,操作成功,则返回1,否则返回0*/if(IsSqstackFull(*S)return 0; /*栈满,操作失败*/S-top+;/*top增1*/S-elemS-top=e; /*将e赋值成新的栈顶*/return 1; 4出栈 int Pop(SQSTACK *S,elemtype *e) /*获取栈顶数据元素,并删除栈顶。操作成功,则返回1,否则返回0*/if(IsSqstackEmpty(
4、*S) return 0; /*如果栈空,操作失败*/*e=S-elemS-top; /*获取栈顶元素*/S-top-; /*删除栈顶*/return 1; ,一、栈顺序栈(4),5判断栈空、栈满 int IsSqstackEmpty(SQSTACK S) /*如果栈空,则返回1,否则返回0*/return S.top=-1; /*top是栈顶标识,是-1时表示空栈*/ int IsSqstackFull(SQSTACK S) /*如果栈满,则返回1,否则返回0*/return S.top=S.size-1; /*top作为elem的下标,其最大值是size-1 */ ,一、栈链式栈(1),链
5、式栈的数据类型定义: typedef struct node_tag elemtype data;struct node_tag *next;NODE, *NODEPTR, *LINKSTACK;链式栈的操作: 1入栈 int Push(LINKSTACK L,elemtype e) /*将数据元素e入栈*/NODEPTR p;p=(NODEPTR)malloc(sizeof(NODE);if(p=NULL)return 0;p-data=e;/*形成数据元素e的结点p*/p-next=L-next;/*将p插到头结点后面*/L-next=p;return 1; ,一、栈链式栈(2),2出栈
6、int Pop(LINKSTACK L, elemtype *e) /*获取栈顶数据,删除栈顶*/NODEPTR p;p=L-next; /*p指向栈顶*/if(p=NULL) return 0;L-next=p-next; /*摘除栈顶*/*e=p-data; /*获取原栈顶数据*/free(p); /*释放原栈顶结点*/return 1;,二、栈的应用括号匹配检查,while(stri!=0)ch=stri;if(ch=()Push(,【任务描述】要求设计算法,对于给定的表达式字符串,检查其中括号是否匹配。,typedef char elemtype;int CheckBracket(ch
7、ar *str) /*如果字符串str中括号配对,则返回1,否则返回0*/int i,len;SQSTACK s; /*定义一个栈*/elemtype ch;len=strlen(str); /*将栈s的最大容量设置为字符串的长度*/ InitSqstack(/*从左向右扫描字符串,遇到括号进行入栈和出栈处理*/,二、栈的应用算术表达式求值(1),与表达式求值有关的知识: 表达式中运算符具有优先级和结合性特征 中缀表达式中,双目运算符需要两个操作数,一个操作数在左边,另一个在右边。 表达式求值算法的基本思想: 从左向右扫描表达式,获取单词。 如果单词是操作数,则入操作数栈; 如果单词是常规运算
8、符或者左括号:如果单词的栈外优先级数高,则将运算符入栈;否则反复出栈处理,直到单词栈外优先级数高为止。 如果单词是右括号,则反复出栈处理,直到运算符栈顶是左括号为止。将左括号出栈。 如果单词是=,反复出栈处理,直到运算符栈空。这时操作数栈的栈顶就是表达式的值。,【任务描述】 已知str是某算术表达式字符串,编写算法求得这个算术表达式的值。比如,str的内容是”22*5+6*(10-5)”,那么算法求得的值应该是140。这个算法不考虑单目运算符。为了简便起见,只允许使用加(+)、减(-)、乘(*)、除(/)、乘方()这5个运算符,这5个运算符都是双目运算符。,二、栈的应用算术表达式求值(2),单
9、词的数据类型: typedef struct int type; /*标识word成员是运算符还是操作数*/union float X; char op; word;WORD; typedef WORD elemtype; #define ERROR 0 #define OPERAND 1 /*标识操作数*/ #define OPERATOR 2 /*标识运算符*/ 算法 int Evaluate(char *exp, float *result) /*计算表达式exp的值,*result存放计算结果。如果操作成功,返回1,否则返回0*/int k=0;WORD w,W1,W2,W3;SQST
10、ACK s1,s2;/*s1是操作数栈,s2是运算符栈*/*result=0;InitSqstack(/*事先在运算符栈放置一个左括号*/,二、栈的应用算术表达式求值(3),while(1) w=GetWord(exp,二、栈的应用算术表达式求值(4),case =:while(s2.elems2.top.word.op!=()/*反复出栈处理,直到遇到最开始放在栈里的左括号为止*/if(!Pop( ,二、栈的应用算术表达式求值(5),default:while(InPri(s2.elems2.top.word.op)OutPri(w.word.op)/*只要栈顶运算符的优先级数大于栈外运算符
11、的优先级数,则反复出栈处理*/if(!Pop(/*属于switch语句*/*属于while(1)语句*/,二、栈的应用迷宫路径求解(1),【任务描述】给定某个迷宫的布局及其入口和出口的坐标(如图3_9所示,注意横坐标是从左向右的,但是纵坐标是从上向下的),迷宫中空白的地方可以走,阴影的部分表示墙壁,走不通。设计算法找出从入口到出口的所有路径。需要解决2个问题: 迷宫在计算机中如何表示。 int maze 12= 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,0,0,1,0,1,1,
12、1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1; 如何探索从入口到达出口的所有路径。 深度优先探索回溯:从当前位置出发,向四个方向探索,如果发现某方向的相邻位置可走,则走过去,将那个位置当作当前位置继续探索。这时需要将原当前位置保存在栈中。如果四个方向都走不通,则退回到出发点(栈顶中的位置)。走过的地方要打上“已走标记”,回退时要将“已走”标记清除。,二、栈的应用迷宫路径求解(2),typedef struct int x,y;/*位置坐标*/int v; /*探索方向*/elemtype;
13、int movex5=0,0,1,0,-1; int movey5=0,-1,0,1,0;#define M 27 #define N 25 #define MAXSIZE 200 算法: void go(int mazeMN ,int x0,int y0 ,int xx ,int yy) /*找出maze中从入口(x,y)到出口(xx,yy)的所有路径*/int x,y,x1,y1,v;SQSTACK s; /*存放探索路径的栈*/elemtype e;InitSqstack(/*初始化栈*/,二、栈的应用迷宫路径求解(3),e.x=x0; e.y=y0; e.v=0;Push(,二、栈的应
14、用迷宫路径求解(4),while(v0 /*(x1,y1)不通,换一个方向探索*/*while循环结束时,说明(x,y)的4个方向都探索过了,应该回退一步*/while stack ,三、递归问题的非递归算法斐波那契问题(1),【任务描述】斐波那契序列中第n项的递归定义如下,设计算法求得第n项斐波那契序列项的值。递归算法 int Fibo(int n) /*斐波那契序列项求解的递归算法*/int val;if(n=1|n=2)return 1;/*到达递归终点*/val=Fibo(n-1)+Fibo(n-2);/*递归调用*/return val;,三、递归问题的非递归算法斐波那契问题(2),
15、非递归算法 【算法思想】首先将问题Fibo(n)入栈。接着进入一个循环:弹出栈顶问题,如果是递归终点,则求值累加;否则将Fibo(n)递归分解为Fibo(n-1)和Fibo(n-2),并将它们分别入栈,直到栈空为止。 【适用条件】由P(n)递归分解产生两个问题规模更小的问题P(n1)和P(n2),它们的求解相互独立,相互之间不构成求解条件。,递归问题的非递归算法设计中栈的作用 保存暂时不能求解的问题,等待条件具备时,再将问题出栈进行求解。被保存的问题,通常是递归分解的结果。,三、递归问题的非递归算法斐波那契问题(3),int Fibonacci(int n) /*非递归算法*/SQSTACK
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 队列 PPT
