线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取

Slides:



Advertisements
Similar presentations
彰化縣和美鎮 和仁國民小學 本土語言教育暨 台灣母語日訪視 簡 報. 一. 學校概況 校地面積 校地面積廣達三公頃 學生活動空間寬廣!
Advertisements

王 子 坊 《洛陽伽藍記》 主講教師:張其昀.
第一章 十六世紀中葉以前的臺灣與原住民 第一節 考古發掘與史前文化.
Ch17 績效管理 章首個案:員工績效管理:奇異強迫排名,3M的15%「私釀酒」時間 17.1 績效管理的意義 17.2 績效管理的流程
与优秀的人在一起
量化vs質性研究分析 量化vs質性研究分析 報告人:王秀民.
與櫻花有約 櫻花開放時間 櫻花前線 賞花便當 京都機場(附近) 夜櫻 哲學之道.
台塑石化 與 全國 之 財務分析 :企管二甲、乙 班級 指導 :楊雪蘭 老師 :第六組 組別 組員
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
唐宋傳奇、筆記小品和史書、論著中的寓言 中碩二 吳佳樺.
兒童期 7 青春期 兩性圓舞曲 乘客:七年級同學 司機:張立杰老師.
姓名:劉芷瑄 班級:J201 座號:39號 ISBN:957-33-1963-2
计算机三级考试C语言上机试题专题.
第二课 战国时期的 百家争鸣 呼伦贝尔学院附属中学:司顺英.
美洲集团散拼项目分享 李维迪.
星星知我心 談古話今….. ……..觀星望斗 主講人: 陽光青春美少男.
反垃圾掩埋場相關報告 組長:文煊 組員:鄭侃文 李浩暐 胡育睿 李瑞耘 朱祐賢 林承宇.
近代的中华民族可谓多灾多难,饱受了西方列强的侵略。在前两课的学习中,我们已经了解了西方列强发动的两次侵略战争,下面我们来简单地回顾一下,这两次战争的名字叫什么?侵略者分别是谁? 在中国近代史上,侵略中国时间最长、危害最大的是哪个国家?
"性"不"性"由你 性別平等之探討 北屯國小 張文陵.
組員: 洪暐翔、 賴峻毅 侯家豪、 賴琦穎 指導老師: 王惠鈴 老師
組長:黃家逸 組員:殷浩賢、楊煜、吳家朗 毒品的害處.
数据结构——树和二叉树 1/96.
Chapter 3: Stack.
十二生肖的故事.
台中市不動產經紀人職業工會 不動產經紀營業員 複訓班
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
Linked List Operations
第3章 栈和队列 3.1 栈 3.2 队列 3.3 应用.
C语言程序设计 第十二章 位运算.
Ch.3 栈和队列 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第3章 栈和队列(二) 1/.
第一章 栈.
第2章 线性表 线性表抽象数据类型 顺序表 主要知识点 单链表 循环单链表 循环双向链表 静态链表 设计举例.
堆疊 Stack chapter 4 德明科技大學資訊科技系.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第 3 讲 线性表(一).
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第三章 栈和队列 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第3章 栈和队列(一).
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
数 据 结 构 Ch.4 串 计 算 机 学 院 肖明军
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
栈和队列练习.
6.3 遍历二叉树和线索二叉树(知识点二) 遍历二叉树 一、问题的提出
第三章 栈和队列.
資料結構 第4章 堆疊.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
王玲 第 2 章 线性表 王玲 2019/2/25.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第六章 树和二叉树 £6.1 树 £6.2 二叉树 £6. 3 二叉树的存储结构 £6.4 二叉树的遍历与线索化 £6.1.1 树的定义
第6章 数组与广义表 6.1 数组的定义及其基本操作 6.2 数组的顺序存储结构 6.3 矩阵的压缩存储 6.4 广义表的概念
C语言复习3----指针.
Linked Lists Prof. Michael Tsai 2013/3/12.
特定消耗品說明 (指碳粉匣、墨水匣) 國立清華大學 保管組製作.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
程式的時間與空間 Time and Space in Programming
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第 六 讲 栈和队列(一).
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
本节内容 指针类型.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
臺中市龍山國小 校園常見瓢蟲辨識   瓢蟲屬於鞘翅目瓢蟲科。目前世界上約有5000多種瓢蟲,台灣地區約有80種以上,其中能捕食有害生物的瓢蟲約七十種之多。瓢蟲因為捕食有害生物為主食,所以又稱為『活農藥』。
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Presentation transcript:

线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取 插入/删除/查找所需元素移动或比较次数=表长度的一半 2018/12/3

线性表小结 (单)链表 头指针 vs. 头结点 插入/删除操作中,不能使链表“断开” 头结点:使得链表的插入/删除算法代码简洁、一致 若无头结点,则在首结点前插入新元素或删除首结点时,头指针需要修改 头指针:对链表(不包括循环链表)的任何操作必须从头指针开始 头指针起着标记链表的作用,通常将头指针称为链表的名字 插入/删除操作中,不能使链表“断开” 必须知道前驱结点的指针 2018/12/3

第三章 栈和队列 第一部分 栈(Stack) 2018/12/3

3.1 栈(stack) 先进后出(FILO) 操作受限的线性表: 只能在表尾进行插入或删除 结构:表尾栈顶,表头栈底 操作:栈顶插入入栈,删除栈顶出栈 只能在表尾进行插入或删除 先进后出(FILO) 入栈 出栈 an a1 a2 ……... ... 栈底 栈顶 栈 s = ( a1 , a2 , …… , an ) 2018/12/3

栈实现1:顺序栈(一维数组) typedef struct { SElemType *base ; //元素数组(指针) SElemType *top ; //栈顶元素位置指针 int stacksize ; //栈空间尺寸 } SqStack ; top 1 2 3 4 … base 栈顶指针 2018/12/3

顺序栈基本操作 1 入栈 关键代码: * s.top = e ; s.top ++ ; 栈满后继续入栈: 上溢(overflow) 栈满 F 2 3 4 5 base E D C B top A 入栈 栈满后继续入栈: 上溢(overflow) 2018/12/3

入栈(push)算法 Status Push ( SqStack &s , SElemType e ){ if ( S.top - S.base >= S.stacksize ) { //栈满 ……//追加空间 s.top = s.base + s.stacksize; s.stacksize += STACKINCREMENT; } * s.top = e; //新元素放入当前栈顶 s.top ++ ; //栈顶(指针)+1 return OK; 2018/12/3

顺序栈基本操作 2 出栈 关键代码: F s.top -- ; e = * s.top ; E D C B A 栈空后继续出栈: 1 2 3 4 5 base F E D 栈空 C B A 栈空后继续出栈: 下溢(underflow) 2018/12/3

出栈(pop) Status pop ( SqStack &s , SElemType &e) { if ( s.top == s.base ) return ERROR ; //栈空 s.top -- ; //栈顶(指针)-1 e = *s.top; return OK; } 2018/12/3

栈实现(2):链栈(单链表) typedef struct SNode { SElemType data ; struct SNode *next ; } StackNode , * LinkStack ; ^ …... H data next 栈底 栈顶 2018/12/3

栈的应用(1) 数制转换:十进制八进制 练习:(3467)10 = (6613)8 N N div 8 (整除) N mod 8 (余数入栈) 3467 433 3 433 54 1 54 6 6 6 0 6 低位:后进先出(LIFO) 高位:先进后出(FILO) 2018/12/3

栈的应用(2) 括号匹配:对任意的括号串进行配对检测 ①若配对,返回:“成功” ②否则,返回:“失败” 例1:( [ ] ( ) ) 例2:[ ( ] ) 例3:[ ( [ ] [ ] ) ] 例4:( ( ) ] ) 成功 失败 成功 失败 2018/12/3

栈的应用(2) 括号匹配:对任意的括号串进行配对检测 思路:基于栈来判断括号配对是否正确 方法:左括号保存、右括号配对 消解 假设:输入中除左/右括号外无其他字符,回车键结束 2018/12/3

栈的应用(2) 括号匹配:对任意的括号串进行配对检测 方法:基于栈,左括号保存、右括号配对 消解 ①读到 (:入栈 ①读到 (:入栈 ②读到 ):与和栈顶的 ( 配对 消解弹出栈顶 ③若输入读完且栈为空:配对成功,算法停止; 若栈先空:输入中剩余的 ) 已无可匹配的 (,出错 若输入先读完:栈中剩余的 ( 已无可匹配的 ),出错 2018/12/3

栈的应用(2):括号匹配算法 Status Check( ){ //检查输入的括号串是否配对成功 InitStack (S); //构造空栈 Push (S,'#'); //栈底符号 #:栈空标志 int bool = 1; //匹配标志:1-成功;0-失败 char ch = getchar (); //键盘读入第一个输入字符 while ( ch != '\n' && bool ) { if ( ch == '(' ) Push ( S , ch ); //左括号入栈 if ( ch == ')' ) { if ( GetTop ( S , e) == '#' ) bool=0; //栈顶元素= #,栈先空,失败 2018/12/3

栈的应用(2):括号匹配算法(续) … else Pop ( S , e); //栈顶元素≠ #,是左括号,配对消解 ch = getchar (); //读入下一个字符 } //end if ) } //end while if ( Gettop ( S , e ) != '#' ) bool = 0; //输入先读完,失败 if ( bool ) printf ("成功") else printf ( "失败" ); } 2018/12/3

栈的应用(3) 表达式求值: 中缀、后缀、前缀 中缀表达式 后缀表达式 a * b + c a b * c + a + ( b * c + d ) / e a b c * d + e / + a + ( b * c + d ) / e a b c * d + e / + ---Reverse Polish Notation 2018/12/3

栈的应用(3) 表达式求值:后缀 例:4+3*5 后缀表达式:4 3 5 * + ① 读入表达式一个符号 ② 若是操作数,压入栈,转 ④ ③ 若是运算符,栈中弹出操作数,运算结果入栈 ④ 若表达式输入完毕,栈顶即表达式值;若未输入完,转 ① 例:4+3*5 后缀表达式:4 3 5 * + top 7 3 5 top 4 top 4 3 top 4 15 top 19 top 2018/12/3

栈的应用(4) 递归:嵌套调用子程序 r s r r s t r 主程序 s t r s r 子过程2 子过程1 子过程3 2018/12/3

栈的应用(4) 递归调用的实现:操作系统内部建立的工作栈 结果:? 1, void print(int w) { 2,2, int i; 3,3,3, void print(int w) { int i; if ( w!=0) { print( w-1 ); for( i = 1; i <=w ; ++i ) printf(“%3d,”, w); printf(“\n”); } 2018/12/3

递归程序执行情况分析: 1 print(0); (3)w=1 (2)w=2 (1)w=3 top (4)输出:1 w (4)w=0 (4)w=0 (3)w=1 (2)w=2 (1)w=3 top w 2 print(1); (2)w=2 (1)w=3 top (3) 输出:2, 2 w 3 print(2); (1)w=3 top (2) 输出:3, 3, 3 w (4)输出:1 (3) 1 (2) 2 (1) 3 top 返回 (3) 1 (2) 2 (1) 3 top (4) 0 主程序 print(3); 结束 (1) (3) 输出:2, 2 (2) 2 (1) 3 top (2) 输出:3, 3, 3 (1 ) 3 top (1) 2018/12/3

典型考题: 1、有6个元素A、B、C、D、E、F依次入栈,允许任何时候出栈,能否得到下列的每个出栈序列,若能,给出栈操作的过程,若不能,说明理由。 1) CDBEFA 2) ABEDFC 3) DCEABF 4) BAEFCD 2018/12/3

典型考题: 1、有6个元素A、B、C、D、E、F依次入栈,允许任何时候出栈,能否得到下列的每个出栈序列,若能,给出栈操作的过程,若不能,说明理由。 1) CDBEFA 2) ABEDFC 3) DCEABF 4) BAEFCD 能:1) 2) 否:3) 4) 为什么? 2018/12/3

操作序列 出栈序列 1) CDBEFA top 2018/12/3

操作序列 出栈序列 push(A) 1) CDBEFA top A 2018/12/3

操作序列 出栈序列 push(A) 1) CDBEFA push(B) top B A 2018/12/3

操作序列 出栈序列 push(A) 1) CDBEFA push(B) push(C) top C B A 2018/12/3

操作序列 出栈序列 push(A) C 1) CDBEFA push(B) push(C) pop(C) top B A 2018/12/3

操作序列 出栈序列 push(A) C 1) CDBEFA push(B) push(C) pop(C) push(D) D B A top 2018/12/3

操作序列 出栈序列 push(A) C D 1) CDBEFA push(B) push(C) pop(C) push(D) pop(D) top B A 2018/12/3

操作序列 出栈序列 push(A) C D B 1) CDBEFA push(B) push(C) pop(C) push(D) pop(D) pop(B) top A 2018/12/3

操作序列 出栈序列 push(A) C D B 1) CDBEFA push(B) push(C) pop(C) push(D) pop(D) pop(B) top push(E) E A 2018/12/3

操作序列 出栈序列 push(A) C D B E 1) CDBEFA push(B) push(C) pop(C) push(D) pop(D) pop(B) top push(E) pop(E) A 2018/12/3

操作序列 出栈序列 push(A) C D B E 1) CDBEFA push(B) push(C) pop(C) push(D) pop(D) top pop(B) push(E) F pop(E) A push(F) 2018/12/3

操作序列 出栈序列 push(A) C D B E F 1) CDBEFA push(B) push(C) pop(C) push(D) pop(D) pop(B) top push(E) pop(E) A push(F) pop(F) 2018/12/3

操作序列 出栈序列 push(A) C D B E F A 1) CDBEFA push(B) push(C) pop(C) push(D) pop(D) pop(B) push(E) top pop(E) push(F) pop(F) pop(A) 2018/12/3

操作序列 出栈序列 3) DCEABF top 2018/12/3

操作序列 出栈序列 push(A) 3) DCEABF top A 2018/12/3

操作序列 出栈序列 push(A) 3) DCEABF push(B) top B A 2018/12/3

操作序列 出栈序列 push(A) 3) DCEABF push(B) push(C) top C B A 2018/12/3

操作序列 出栈序列 push(A) 3) DCEABF push(B) push(C) push(D) D C B A top 2018/12/3

操作序列 出栈序列 push(A) D 3) DCEABF push(B) push(C) push(D) pop(D) C B A top 2018/12/3

操作序列 出栈序列 push(A) D C 3) DCEABF push(B) push(C) push(D) pop(D) pop(C) top B A 2018/12/3

操作序列 出栈序列 push(A) D C 3) DCEABF push(B) push(C) push(D) pop(D) pop(C) top push(E) E B A 2018/12/3

操作序列 出栈序列 push(A) D C E 3) DCEABF push(B) push(C) push(D) pop(D) pop(C) top push(E) pop(E) B A 2018/12/3

操作序列 出栈序列 push(A) D C E A? 3) DCEABF push(B) push(C) push(D) pop(D) pop(C) top push(E) pop(E) B A 2018/12/3

合法出栈序列判定 入栈序列1、2、…… n,出栈序列为p1、p2、…… pn 定理:若 i<j<k,则不存在出栈序列 pk < pi < pj i < k,而 pk < pi,即 i 先入栈,但需后于 k 出栈,则 k 压在 i 上 j < k,而 pk < pj,即 j 先入栈,但需后于 k 出栈,则 k 压在 j 上 又 k 最先出栈,所以 i , j 均在栈内,按入栈顺序 j 必在 i 上 所以,不可能 i 先于 j 出栈,即 pi<pj 2018/12/3

栈:小结 逻辑结构:线性表 存储结构: 基本操作 操作受限:只在一端插入/删除(LIFO) 顺序栈:栈顶指针-栈顶元素后的空位置 链栈: 入栈(push) 出栈(pop) 2018/12/3

栈:小结 应用:栈能够记忆处理的中间结果 数制转换 过程调用(递归) 括号匹配 表达式计算 后缀表达式计算 中缀表达式计算 (中缀表达式转换为后缀表达式) 2018/12/3