第六讲栈和队列(一)增加 1/13.

Slides:



Advertisements
Similar presentations
第四章 衛生保健及急救 組員: 4990U002 何易芳 4990U021 張書涵 4990U035 沈采柔 4990U036 王孜瑜 4990U039 許佳靜 4990U043 黃懿華 4991U002 柳瑋翎 4991U008 陳禹伶 第五組.
Advertisements

练一练: 在数轴上画出表示下列各数的点, 并指出这些点相互间的关系: -6 , 6 , -3 , 3 , -1.5, 1.5.
1.1 程序和程序设计 程 序:简单的说程序就是指令的集合。 计算机设计语言: 机器语言 :二进制 0 、 1 汇编语言:助记符(英语单词)。 高级语言: 人类自然语言(数学语言 + 英语) 如: C 语言、 Qbasic 、 VB 等 第一章:程序设计基本概念.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
每节一经典 用系统的观点观察问题 总体设计,逐步求精 计算机科学学院 王小明 (博士/教授/博士生导师)
计算学科的基本问题 本章首先介绍一个对问题进行抽象的典型实例——哥尼斯堡七桥问题。然后,通过“梵天塔”问题和“停机问题”分别介绍学科中的可计算问题和不可计算问题。从“梵天塔”问题再引出算法复杂性中的难解性问题、P类问题和NP类问题,证比求易算法,P=NP是否成立的问题。
计算机三级考试C语言上机试题专题.
四資二甲 第三週作業 物件導向程式設計.
C#程序设计案例教程 第3章 程 序 结 构.
第一章 C语言概述 计算机公共教学部.
第 5 章 流程控制 (一): 條件分支.
5 函数(二) 5.1 基本知识 5.2 函数重载 5.3 示例 5.4 变量的作用域和生命期 5.5 编译预处理 5.6 递归函数.
第三章 控制结构.
程式設計實作.
C#程序设计基础 $5 流程控制.
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
Class 2 流程控制-選擇敘述與迴圈.
C++Primer 3rd edition 中文版 Chap 5
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取
本 章 说 明 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队 列 本 章 小 结 返回主目录.
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
走进编程 程序的顺序结构(二).
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
C语言 程序设计基础与试验 刘新国、2012年秋.
第三章 栈和队列 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第3章 栈和队列(一).
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
数 据 结 构 刘家芬 Sept 2012.
动态规划(Dynamic Programming)
6.3 遍历二叉树和线索二叉树(知识点二) 遍历二叉树 一、问题的提出
第三章 栈和队列.
#define STACK_INIT_SIZE 10
第3章 栈和队列 ——操作受限的线性表 3.1 栈 3.1.1抽象数据类型栈的定义 3.1.2栈的表示与实现
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
数据结构概论 第3章 栈和队列 董黎刚 浙江工商大学信电学院 2019年2月25日.
第四章 栈和队列 4.1栈 4.2栈的应用 4.3队列 4.3队列应用.
专题作业.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
程式結構&語法.
顺序表的删除.
第三章 C++的语句和简单的程序设计 主要内容:
11.1 递归的定义 11.2 常见递归问题 11.3 递归的实现 11.4 递归转化为非递归的一般过程 11.5 递归的时间和空间复杂度
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
第4章 Excel电子表格制作软件 4.4 函数(一).
資料結構與C++程式設計進階 遞迴(Recursion) 講師:林業峻 CSIE, NTU 6/ 17, 2010.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
小数的大小比较 仙岩镇第二小学 陈曼丽.
第二章 Java语法基础.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第2章 Java语言基础.
多重條件選擇敘述
05 债务重组.
C语言基本语句 判断循环.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
考察点:switch\while\for System.in\Scanner char vs int
第二章 Java基本语法 讲师:复凡.
Presentation transcript:

第六讲栈和队列(一)增加 1/13

栈 教学目标 掌握栈的应用:数制转换、括号匹配检验和行编辑程序; 理解栈在递归函数调用中的应用。 2/13

数制转换-1 N = (N div d)×d + N mod d 举例说明 10进制数转换为d进制数的原理 N         N div 8           N mod 8 1348      168                   4 (个位)   168         21                   0 (十位)      21          2                      5 (百位)      2        0                     2 (千位) 2504 3/13

数制转换-2 提出问题:输入任意一个非负十进制整数,要求输出与其等值的八进制数。 分析问题:转换过程是从低位到高位顺序产生八进制数的各个数位,然而打印输出需要从高位到低位进行。 分析结果:如果将计算过程中得到的八进制数的各位顺序进栈,则按出栈序列打印输出的即为与输入对应的八进制数。 4/13

数制转换函数代码 void conversion (int N) { InitStack(S); // 构造空栈 do { Push(S, N % 8); N = N/8; } while (N!=0) while (!StackEmpty(S)) { Pop(S,e); printf ( "%d", e ); } } // conversion (1348)10 = (2504)8 如果用递归,则应该如何实现? 5/13

括号匹配的检验 扫描该表达式的每个字符,为左括号便入栈;为右括号便检验栈顶是否为与其匹配的左括号,如果是则出栈,否则说明括号不匹配。 假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,则正确的嵌套格式: [([][])], 不正确的嵌套格式: [(](]]。 算法设计思想 扫描该表达式的每个字符,为左括号便入栈;为右括号便检验栈顶是否为与其匹配的左括号,如果是则出栈,否则说明括号不匹配。 当扫描结束时,栈为空则说明括号匹配,否则不匹配。 6/13

括号匹配函数代码 status matching(string exp) { InitStack(S); int state = 1; //匹配时state为1,否则state为0 while (i<=length(exp) && state){ swith (exp[i]) { case 左括号: { Push(S,exp[i]); i++; break; } case 右括号: { if (!StackEmpty(S) && GetTop(S) == 对应左括号) { Pop(S,e); i++; } else { state = 0; } break; } default: break; } //switch } //while if ( state && StackEmpty(S) ) return OK ; else return ERROR; } // matching 7/13

行编辑程序 行编辑程序的功能 举例说明 算法设计思想 whli##ilr#e(s#*s) while (*s) 接受用户从终端输入的程序或数据,并存入用户的数据区。 允许用户输入出差错,并在发现有误时可以及时更正。 举例说明 设退格符“#”表示前一个字符无效;退行符“@”表示当前行中的字符均无效。 算法设计思想 如果它既不是退格符也不是退行符,则将该字符压入栈顶;如果是一个退格符,则从栈顶删去一个字符;如果它是一个退行符,则将字符栈清为空栈。 whli##ilr#e(s#*s) outcha@putchar(*s=#++); while (*s) putchar(*s++); 8/13

行编辑程序代码 void LineEdit(){ InitStack(S); ch = getchar(); while (ch != EOF){ while (ch != EOF && ch != '\n'){ switch (ch){ case '#' : Pop(S, c); break; // 仅当栈非空时退栈 case '@': ClearStack(S); break; // 重置S为空栈 default : Push(S, ch); break; // 有效字符进栈 } //switch ch = getchar(); // 从终端接收下一个字符 } //while 将从栈底到栈顶的字符传送至调用过程的数据区; ClearStack(S); // 重置S为空栈 if (ch != EOF) ch = getchar(); DestroyStack(S); }// LineEdit 9/13

栈与函数调用之间的关系 将所有的返回地址和实在参数等信息传递给被调用函数保存; 为被调用函数的局部变量分配存储区; 主调函数调用被调函数 将所有的返回地址和实在参数等信息传递给被调用函数保存; 为被调用函数的局部变量分配存储区; 将控制转移到被调用函数的入口。 被调用函数返回调用函数 保存被调函数的计算结果; 释放被调函数的数据区; 依照被调函数保存的返回地址将控制转移到调用函数。 10/13

栈与递归函数调用之间的关系 long f(int n){ if(n==0)return 1; return (n*f(n-1)); } 思考题:分析栈的变化情况。 11/13

Hanoi塔问题 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中任一塔座上。

Hanoi塔问题 当n=1时,问题比较简单。此时,只要将编号为1的圆盘从塔座a直接移至塔座b上即可。 当n>1时,需要利用塔座c作为辅助塔座。此时若能设法将n-1个较小的圆盘依照移动规则从塔座a移至塔座c,然后,将剩下的最大圆盘从塔座a移至塔座b,最后,再设法将n-1个较小的圆盘依照移动规则从塔座c移至塔座b。 由此可见,n个圆盘的移动问题可分为2次n-1个圆盘的移动问题,这又可以递归地用上述方法来做。由此可以设计出解Hanoi塔问题的递归算法如下。 在问题规模较大时,较难找到一般的方法,因此我们尝试用递归技术来解决这个问题。 public static void hanoi(int n, int a, int b, int c) { if (n > 0) hanoi(n-1, a, c, b); move(a,b); hanoi(n-1, c, b, a); }

小结 本讲主要介绍了栈的应用,重点介绍了数据转换、括号匹配、行编辑程序以及栈在函数调用中的作用。 14/13

作业与实验 作业 简述栈在函数调用中的作用。 利用栈将链表中的数据逆序打印出来。 实验 无 15/13