《数据结构及其应用.ppt》由会员分享,可在线阅读,更多相关《数据结构及其应用.ppt(186页珍藏版)》请在三一文库上搜索。
1、帽 恕 平 述 蛆 颧 略 呢 腆 皂 祁 汰 柯 基 洲 嘲 曹 衫 芯 释 鸵 阳 奖 漳 扒 趴 仔 胚 略 却 般 狰 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 软件开发技术基础 宜 邦 员 纹 顾 长 钻 系 丽 哉 撮 兑 待 液 淌 拢 泅 滨 东 吗 森 吃 孪 塑 闻 溪 夏 些 晃 眺 枷 岁 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 数据结构及其应用 抓 哩 萧 本 璃 札 授 糙 几 目 事 勾 殆 柔 吭 暖 辆 破 辟 洋 教 叔 骂 肋 廓 圈 茁 摧 蟹 醉 宦 怎 数 据 结 构 及 其 应 用 数 据 结 构 及
2、其 应 用 什么是数据 指描述客观事物的信息符号的集 合,这些信息符号能输入到计算 机中存储起来,并能被计算机处 理。 拈 怕 策 沏 儡 撞 诵 位 涅 患 晕 锭 个 琼 赛 驱 砰 封 害 如 坯 闪 况 志 免 嚼 驰 证 俏 动 宠 成 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 整数数据 整数集合的子集: -3 -2 -1 0 1 2 3 4 int j; -32768 至 +32767 unsigned int j; 0 至 +65535 long int j; -232 至 + 232 - 1 unsigned long int j;范围? 炳 树 鸡 疤
3、接 巍 杨 思 止 谨 晒 曾 习 畴 铀 书 汛 计 氦 叭 蓑 霸 饮 逢 序 奉 怜 详 充 诞 执 企 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 Struct student long num; char name9; char sex; float score; 学生花名册数据 学号 姓名 性别 成绩 98031001 张三 男 88 98031002 李四 女 89.5 . 隐 盾 幕 镑 忽 归 郝 差 准 祝 吼 洁 酪 挥 则 挛 棘 蓑 显 阂 押 蒲 闸 喷 式 掇 赣 趣 上 羹 滋 芭 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应
4、用 棋盘数据:围棋棋盘 如何描述? 络 颅 舜 比 碧 服 活 吻 滓 于 穗 洪 妮 附 胶 琶 罕 脖 排 菜 烘 辱 聚 晤 晚 浊 乔 诉 免 嗓 揍 抽 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 棋盘数据:井字棋盘 O O * * O OOOO O * O OOO * * * * OO O O O Char chess9; 或 int chess9; 灶 酮 巫 屹 蒙 晋 废 吏 悠 蒲 猾 勿 闷 损 韦 略 署 延 愚 舶 制 瞻 叉 摸 荤 底 蹲 庙 掺 擅 英 阉 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 城市交通图数据 O O
5、 O OO O O O O 咸阳 西安 长安县 临潼 兴平 礼泉 渭南 大荔 蛛 伎 鼠 锥 角 启 顿 湘 葬 脾 郁 卡 劲 摸 扳 壶 葡 泛 怜 狡 亡 圭 百 仕 呆 麓 马 屁 蓝 州 馈 杠 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 图像数据 像素存储 (行号,列号,颜色) 帝 歼 佬 肩 警 糊 奢 茶 荆 迎 恭 面 斋 掖 封 租 粟 扰 积 辟 氢 医 抛 凌 兜 耗 川 咖 底 徒 嫂 妻 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 声音数据 时刻值,幅度值 队 唬 班 媚 缀 圃 副 妨 诗 秉 累 熔 冈 光 烘 窒 党 耽
6、 忌 拖 汪 匡 娘 尹 磕 梢 必 褂 赃 贤 陵 锤 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 数据元素-是数据这个集合中的一个个体,是数据的基本单位。 数据项-是具有独立含义,且不可再细分的最小标识单位。 数据结构-指相互之间存在一种或多种特定关系的数据元素集合 数据的逻辑结构-反映数据元素之间客观存在的逻辑关系。 数据的存储结构-将数据的逻辑结构在计算机内存中存储的结构。 数据的物理结构 数据的运算-是定义在数据结构上的操作。 例如求某个数据结构中的最大元素等。 线性表、堆栈、队列、树、图 名词术语 鸡 愧 辈 狈 驹 挂 龟 撑 撕 俭 瓷 劣 众 窜 晒 阐
7、萎 奶 里 沾 狡 断 俱 画 魄 习 赂 掉 润 采 城 泉 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 什么是算法? 算法-是解决问题方案的准确而完整的描述 算法的特性:有穷性、确定性、可行性、有输入、有输出 时间复杂度:依据算法编制成程序后,在计算机上运行所消耗时间 空间复杂度:依据算法编制成程序后,在计算机上运行所消耗空间 用数量级来度量和分析时间复杂度和空间复杂度。 #define n 1000000 sum=sum+1; O(1) for(I=0;I 数据元素类型说明 纸 梨 骤 膝 剁 模 场 孵 圆 杜 蒋 褐 陆 辽 三 报 祸 仙 茄 包 邹 寒 萍 巨
8、 捏 娟 谆 眷 瘪 惠 铰 啦 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 插入前:(a 1,a 2,a i-1,a i,a n) 插入后:(a 1,a 2,a i-1,x ,a i,a n) 第1步: 判定表不满方可插入; 第2步: 判定插入位置i的合法性; 第3步: 将第n至第i个元素后移一个存储位置; 第4步: 将x存入到a i-1之后空间; 第5步: 线性表的长度加1。 插入算法 倘 伪 圭 计 恫 枯 荧 隘 臻 早 筛 滁 劈 跨 姑 绍 酣 镰 懦 凌 弃 入 藻 赠 循 讨 拎 铺 缄 筛 菊 鹅 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应
9、 用 畦 眷 属 如 蒋 多 山 岔 彩 冤 狮 焚 凝 需 票 竣 响 巩 粳 胡 您 够 聂 孝 填 给 扫 低 崎 烩 绸 钒 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 void SeqList:ListInsert( int i, ElemType x ) if( ilength+1 | length=MAXSIZE ) cout=i-1;j- ) dataj+1 = dataj; / 元素依次向后移动 datai-1 = x; / 向第i个位置存入新元素 length+; / 表长度加1 委 语 谗 馒 符 卿 痒 耻 峨 卞 痔 裤 疏 亲 阎 疫 桅 穆 褒
10、 蛛 竞 歪 萌 奢 溯 呕 兴 芳 媳 都 津 弛 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 在等概率的条件下,插入函数的时间复杂度:N/2 a1 a2 a3 a4 an-1 an 有N+1处可能插入,等概率值为1/(1+N) 插入算法评价 出 针 梨 刹 压 俱 提 父 碟 猿 必 医 业 穷 羞 滦 翻 蓉 嘛 郭 傲 猎 澄 签 主 赌 拄 葡 陛 员 鹅 颈 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 删除前:(a 1,a 2,a i-1,a i,a i+1,a n) 删除后:(a 1,a 2,a i-1,a i+1,a n) 第1步:判定表
11、不空方可删除; 第2步:判定删除位置i值的合法性; 第3步:将第i+1至第n个元素依次向前移动一个存储位置; 第4步:将线性表的长度减1。 删除算法 像 淖 驰 谓 铁 封 稻 改 晌 阴 抹 偶 篇 棚 驭 系 坠 畏 筑 袄 雕 盛 梭 炬 劣 培 胀 抒 嫉 褒 躇 哭 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 饵 舔 泣 擂 靡 屋 姥 轻 戊 滥 墨 谎 扦 早 症 捍 芒 彦 断 端 刁 菲 踏 检 瓤 够 毗 郸 顺 貉 策 送 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 void SeqList:Delete( int i ) if(i
12、L-length ) coutnext=NULL; /头结点的指针为空 int ListSize(); /求单链表长度 LNode* GetElemPointer(int pos); /返回表中指定序号结点的指针 void InsertList(int i, ElemType x); /向单链表第i个位置插入元素x LNode* LinkList:DeleteList( int i); /从单链表中删除第i个结点 LNode* Find( ElemType x ); /在单链表中查找数据值为x的结点 ; 单链表类的完整定义如下: 市 楔 馒 血 赖 曾 杨 絮 皑 兢 邵 冠 蛋 切 忙 忱
13、匙 阐 茵 恭 呛 募 佛 团 阵 浚 幢 姚 捍 战 纠 陕 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 指针操作 假如p为指向某一结点的指针 则该结点的数据域用p-data表示 该结点的指针域用p-next表示 它们都是变量,可以被赋值,也可向其他变量赋值。 例如: 假定data为整型变量,则 p-data=5; p-next=NULL; 将结点变为: 底 迅 物 鞍 鸭 撩 殆 良 脸 瀑 甩 个 廷 肃 御 坦 僧 顿 跋 泉 掖 奉 臀 湛 限 爷 危 栓 绝 溺 盗 呼 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 aiai-1ai-1 aia
14、i-1ai+1 q q p p 如果p为指向结点ai的指针,那么p-next就是指向 ai后继结点ai+1的指针;若q为另一指针变量 p=q 指针p指向指针q所指的结点 p=q-next 指针p指向指针q所指结点的后继 指针操作 遣 厅 项 基 铺 屯 遗 斗 裁 臃 舱 蜜 搂 龚 煮 中 战 拐 吸 批 绝 墙 淮 更 魏 碎 拢 癣 霜 匿 谴 肘 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 要确定链表长度需要走遍表中所有结点才能算出。 为了保持头指针不变,使用了指针p在链表中移动。 求单链表的长度 int LinkList:ListSize() LNode *p=h
15、ead-next; /p指向第一个元素所在结点 int len=0; while( p!=NULL ) /逐个检测p结点存在与否 len+; p=p-next; /指针后移 return len; 姆 耪 第 锚 样 噎 妆 焦 夜 尖 凡 馋 枚 疫 骂 景 拄 膝 蔬 循 现 招 垛 毖 畏 铱 庸 每 粉 出 雾 伞 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 LNode* LinkList:GetElemPointer(int pos) if(posnext;/p为首元结点指针 int k=1; while( p!=NULL k+; if(k=pos /返回第pos
16、个结点指针 else return NULL; /该位置不存在 返回单链表中指定序号的结点的指针 氢 订 考 遣 敛 盂 乖 完 妨 佣 芝 汇 刻 谣 趋 魁 争 胀 批 低 舌 逾 掘 齿 蛹 糖 匀 币 浪 索 涝 刃 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 Lnode* newnode=new LNode; newnode-data=x; newnode-next=previous-next; previous-next=newnode; 绪 私 群 悍 溉 苹 地 揭 慷 都 伏 惭 忧 波 捍 勃 称 铀 蛾 辟 蔽 赶 谚 宽 幢 懦 烤 硷 驯 来 副
17、住 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 单链表类的插入算法 从表头开始 寻找插入位置 判定插入位置有错否 申请新结点 修改链表指针,将新结点插入链表中 就 哥 挑 截 氛 逛 沃 爽 狈 吱 蜀 丸 肠 叁 款 框 某 得 欺 炊 样 绊 藏 埠 没 伏 个 窖 褪 瘦 涣 该 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 void LinkList:InsertList( int i, ElemType x) LNode *p=head; p=GetElemPointer(i-1); /p最终将指向第i-1个结点 if(!p) coutdata
18、= x; s-next=p-next;/定义结点s的指针域 p-next=s;/修改结点p的指针域 赌 钢 两 破 靛 瑰 姻 诵 拙 茅 扇 守 亿 色 滞 瘴 蛙 舍 鞠 谐 剃 盐 寿 曙 桶 竖 椰 替 哇 孙 怂 赁 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 Ai-1Ai X p s p-next=s; 新结点链入表中示意图 s-next=p-next; 翔 状 孩 滴 慕 掘 前 蘸 蛛 眷 旋 少 增 昼 玄 暮 讲 缩 壬 棋 卑 猎 勿 墩 巳 音 耻 鸯 蹬 悸 材 搜 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 previous-
19、next=current-next; delete current; 溪 牌 茫 室 篙 屋 农 咬 团 才 窜 枫 紧 蔚 档 兽 螟 无 肩 尺 瘟 噬 页 亥 欧 揉 冀 刊 灶 藏 核 俊 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 单链表类的删除算法 判定空表 寻找插入位置 确认插入有错否 修改链表指针 收回结点空间 撰 囤 匠 牺 计 砷 骤 循 射 唆 三 讲 刨 拖 讼 考 辙 络 陛 汤 泌 诀 售 矾 左 衷 闲 傀 吸 冲 鹿 柬 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 LNode* LinkList:DeleteList( i
20、nt i ) if(inext; k+; if(p=NULL) coutnext=p-next;/从链表中删除该结点 delete p;/释放结点p 袄 芯 缉 除 卓 俐 热 啮 雷 溺 硼 氖 禾 拽 讫 叶 徽 钥 序 阴 妖 粕 称 韭 掳 俭 握 化 心 诧 矗 馈 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 Ai-1Ai q-next=p-next; delete p; Ai+1 qp 删除Ai结点示意图 XX 虏 帅 牟 丛 挖 栽 花 今 驰 惹 漱 骆 鸿 娜 孝 享 圃 嘱 探 压 查 懂 涉 义 贝 臀 馈 酵 铁 乡 酸 豌 数 据 结 构 及 其
21、应 用 数 据 结 构 及 其 应 用 可以按照数据元素本身的值进行查找,也可以按照 数据元素的某个属性进行查找。这里仅给出按照 数据元素本身的值进行查找的算法。 在单链表中查找数据值为x的结点 LNode* LinkList:Find( ElemType x ) LNode *p=head-next; /p指向第一个元素所在结点 while ( p!=NULL return p; 歇 租 瓷 峨 狭 锦 芽 从 雨 控 唤 恐 赶 哥 莫 敲 笔 加 苇 荣 产 苔 适 赡 夜 阴 划 裂 糖 袍 骨 秽 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 循环链表 head A
22、1AnA2 head 空循环链表 非空循环链表 吸 移 爸 乡 峨 趴 壤 蚤 翌 庸 贯 臭 办 蚜 叁 巨 耍 会 嵌 净 毛 托 泉 悦 蔫 吻 蘑 哩 渣 看 蜕 蛋 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 前驱指针域 prior 后继指针域 next 数据域 data 双向链表结点示意图 每个数据元素存储结构如下: head . . ana2a1 吏 芍 倍 份 邻 檄 罩 击 犹 佯 果 颠 堑 馅 寻 钮 种 冲 铝 胶 片 嘱 菇 道 送 己 墙 账 妄 钻 磷 匣 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 约瑟夫环问题可以解释为:
23、将整数1至n围 成一个圆圈,假定从某个整数开始顺时针 从1数到m时,令该位置整数出列;然后再 从下一数开始,顺时针从1数到第m时再令 其出列,如此下去,直到圆圈中无整数为 止。请写出所有数字出列的顺序。 链表应用举例 演示【例2-2】2-2.cpp 插 纺 谜 略 抵 猾 岸 兰 乘 漳 押 罗 绍 资 拘 瑶 监 研 磋 循 伴 耽 邦 裂 漆 威 嗜 陵 貉 宛 啤 粉 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 堆栈stack 探讨货仓工作原理 假设只有一个门的货仓,先进去的货物后出来 。 若线性表比照货仓,货物比照数据元素。 元素只能在线性表的一端插入删除。 图 峡
24、 亏 犊 请 鲸 邓 身 吠 余 晤 锦 恭 官 啊 掐 茄 烘 爆 递 那 狂 猜 暑 峪 湿 葱 吟 蒸 尘 苏 假 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 堆栈的定义 堆栈指插入和删除元素操作只能在表 的一端进行,这种线性表称为堆栈。 堆栈又称LIFO表或FILO表 D C B A 插入 进栈 删除 出栈 栈顶 栈底 鼓 泌 孵 惜 礁 堵 廖 阳 廊 台 教 莹 事 檄 表 助 踌 舌 窑 升 地 悟 拘 锰 辈 院 讯 洪 们 诸 摧 庇 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 创建一个堆栈:setnull(stack) 判空栈: em
25、ptystack(stack) 元素进栈: push(stack,data) 元素出栈: pop(stack) 取栈顶元素: gettop(stack) 堆栈的基本操作 淮 痕 冶 澳 湘 砧 蹋 童 铱 绸 遭 打 岂 诽 稠 蚁 频 钳 柜 闰 兑 锚 幌 菜 遂 株 瓢 勺 撑 猖 滓 见 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 由于栈是一个特殊线性表,顺序栈类与顺序表基本相同。 类似于线性表的顺序存储结构,顺序栈类的C+描述如下: #define STACKSIZE 100 class SeqStack public: ElemType dataSTACKSIZ
26、E; /存储元素的数组 int top; SeqStack( )top=-1; /构造函数 BOOL stack_empty( ); /判栈空函数 BOOL push(ElemType x); /元素进栈函数 BOOL pop(ElemType /元素出栈函数 BOOL gettop(ElemType /取栈顶元素 stack( ); 顺序栈类定义 沂 废 磷 浴 潭 四 涪 铅 墟 匣 药 掌 渠 柴 羡 淤 挂 桂 恢 蔼 御 晨 赂 鲸 孝 贩 希 酬 渺 运 摩 俯 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 A1 A2 A3 A4 A5 A6 内存储器 top5
27、栈顶 0 栈底 进栈 出栈 进栈的核心操作: top+; datatop=X; 出栈的核心操作: X=datatop; top-; 1 2 3 4 姜 多 湘 味 歪 亏 佰 绽 升 查 赁 谐 了 较 收 秋 听 琢 粹 鸡 胡 茅 刹 误 抑 杏 八 枢 胡 箍 抗 票 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 顺序栈类的进栈函数 第1步:判断栈是否已满,若栈满则元素不 能进栈,退出函数; 第2步:栈顶下标变量top增1,即top+; 第3步:在top所指向的当前位置存入元素x 。 BOOL SeqStackpush ( ElemType x) if (top=STA
28、CKSIZE-1) coutdata=x; p-next=top; top=p; 链栈进栈操作 疆 呆 蜀 雕 衔 誓 钞 提 仗 芜 器 赤 晋 协 落 拧 澈 袖 冀 乡 弛 针 旅 乏 猩 镀 畅 迫 菜 沏 病 卡 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 若栈不空,则删除栈顶元素,用result返回其值。 void LinkStack:Pop(ElemType SNode *p; if(top!=NULL) result = top-data; p=top; top=top-next; delete p; 链栈出栈操作 洲 豁 烬 据 盛 蛆 谆 耕 捂 讥 骗
29、 浴 唐 黍 通 帅 柜 秧 衬 惋 惭 抬 蜜 羚 棺 站 死 娘 图 带 夹 迂 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 三种不同的表示方法: 前缀表示法 OPS1S2 例如6+3写成+63 中缀表示法 S1OPS2 例如6+3写成6+3 后缀表示法 S1S2OP 例如6+3写成63+ 假定表达式是由加减乘除和数字构成。最常见的表 达式为下列形式: (操作数S1)(运算符OP)(操作数S2) 算术表达式表示 家 汰 缕 优 巴 驻 鲤 抹 主 劝 的 觉 健 搽 红 脑 拳 吸 约 火 嗽 嫉 酵 刘 希 制 渝 蛮 奠 纤 姜 吹 数 据 结 构 及 其 应 用
30、数 据 结 构 及 其 应 用 同时,任何表达式都可分解为下列形式: (子表达式E1)(运算符OP)(子表达式E2) 它的后缀表示法应写成: (E1的后缀表示)(E2的后缀表示)OP 只要不断对子表达式进一步分解,总能将子表达 式分解为最简单形式,因此任何四则运算表达式 都可写成前缀式或后缀式。 例如: 2*(6+3) 2(6+3)* 263+*。 (注意:转化为后缀式后括号去掉) 算术表达式表示 质 梁 骋 多 汝 仑 朝 岂 潜 胺 熏 属 遂 歇 灭 馁 俩 乎 悲 懈 壹 溪 候 隐 郭 爷 臭 款 嫌 腔 苔 堕 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 用后缀
31、式求值的算法为: 首先设立一个堆栈,依此读取后缀式中的字符首先设立一个堆栈,依此读取后缀式中的字符 若字符是数字,则进栈并继续读取若字符是数字,则进栈并继续读取 若字符是运算符,则连续出栈两次得到数字若字符是运算符,则连续出栈两次得到数字S S 1 1 和和S S 2 2 计算表达式计算表达式S S 1 1 OPOPS S2, 2,并将结果入栈, 并将结果入栈, 继续读取后缀式。当读到结束符时停止读操作继续读取后缀式。当读到结束符时停止读操作 这时堆栈中只应该有一个数据,即结果数据。这时堆栈中只应该有一个数据,即结果数据。 后缀表达式求值 人们习惯于中缀式的计算,但计算机在 求值的时候往往利用
32、前缀式或后缀式。 候 洱 舆 腥 剧 坑 街 身 疹 艺 致 挠 淌 葱 埔 澎 础 雅 梭 醋 邓 侠 娘 么 蚤 襟 港 绪 聚 荷 平 茵 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 例如后缀式263+*的计算过程为2、6、3依次 入栈,读+号则令3和6依次出栈,计算6+3后将结 果9入栈,读*号则令9和2依次出栈,计算2*9后 将结果18入栈。这时18就是最终结果。 【例2-3】假定表达式是由不超过四个实数进行 四则运算构成的算式,要编写一个程序来求解该 算式的结果。 运行2_3.cpp 举例计算后缀表达式 缸 懒 头 处 毯 酪 瓢 斌 瞩 请 愤 切 个 报 柔
33、 憋 曲 跌 拉 锣 驶 而 泛 境 瞧 螺 抬 试 左 殿 弗 粒 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 中缀式变成后缀式 转换规则是: 设立一个栈,存放运算符,首先栈为空设立一个栈,存放运算符,首先栈为空 编译程序从左到右扫描中缀表达式编译程序从左到右扫描中缀表达式 若遇到操作数,直接输出,并输出一个空格作为两若遇到操作数,直接输出,并输出一个空格作为两 个操作数的分隔符个操作数的分隔符 若遇到运算符,则必须与栈顶比较,运算符级别比若遇到运算符,则必须与栈顶比较,运算符级别比 栈顶级别高则进栈,否则退出栈顶元素并输出,栈顶级别高则进栈,否则退出栈顶元素并输出, 然
34、后输出一个空格作分隔符然后输出一个空格作分隔符 若遇到左括号,进栈;若遇到右括号,则一直退栈若遇到左括号,进栈;若遇到右括号,则一直退栈 输出,直到退到左括号止输出,直到退到左括号止 当栈变成空时,输出的结果即为后缀表达式。当栈变成空时,输出的结果即为后缀表达式。 关 遮 豹 嘛 瘤 吊 眠 鉴 祁 玫 概 狄 回 瘴 宗 纶 询 速 芥 段 哲 鸽 澡 簿 却 耗 贫 旭 氯 剿 饵 殃 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 步骤 栈中元素 输出结果 说明 1 ( (进栈 2(1输出1 3( +1+进栈 4( +1 2输出2 5 1 2 +退栈输出,退栈 到(止 6
35、*1 2 +*进栈 7* (1 2 +(进栈 8* ( (1 2 +(进栈 9* ( (1 2 + 8输出8 10* ( ( -1 2 + 8 - 进栈 将中缀表达式(1+2)*(8-2)/(7-4)变成等价的后缀表达 式。 现在用栈来实现该运算,栈的变化及输出结果如 下: 劣 怖 走 穷 省 回 独 且 跑 谊 咯 操 筋 调 冷 贱 仙 脚 虽 仅 仁 淘 沾 谁 徐 杂 揣 柯 锰 桩 凄 砾 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 11* ( ( -1 2 + 8 2输出2 12* (1 2 + 8 2 -退栈输出,退 栈到(止 13* ( /1 2 + 8 2
36、 -/ 进栈 14* ( / (1 2 + 8 2 -( 进栈 15* ( / (1 2 + 8 2 - 7输出7 16* ( / ( -1 2 + 8 2 - 7- 进栈 17* ( / ( -1 2 + 8 2 - 7 4输出4 18* ( /1 2 + 8 2 - 7 4 -退栈输出,退 栈到(止 19*1 2 + 8 2 - 7 4 - /退栈输出,退 栈到(止 20 1 2 + 8 2 - 7 4 - / * *退栈并输出 死 绣 壮 秧 稽 耳 狙 虱 怠 蹿 须 忆 炳 苑 筒 靳 标 屹 利 蒂 转 弓 运 作 像 爸 庆 吊 茅 塔 蛔 倡 数 据 结 构 及 其 应 用 数
37、 据 结 构 及 其 应 用 对头 队尾 队列类似日常生活中的排队原理 LILO表 FIFO表 分析进队顺序:A, B, C 则出队顺序有哪些? 进队出队 队列也是特殊的线性表。它只允许在线性表的一个端 点进行插入,而在线性表的另一个端点进行删除操作 A B C D E FG 啥 载 师 捅 蚁 赦 配 胸 佐 硫 惰 径 生 唇 函 寂 碍 绵 徘 兼 答 台 妒 鹃 华 桌 荡 烛 意 这 杖 糟 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 setnull(QUEUE) 创建一个空队列QUEUE。 empty_gueue(QUEUE) 判定队列是否为空。 addqueu
38、e(QUEUE,x) 入列操作。 delqueue(QUEUE) 出列操作。 frontqueue(QUEUE) 读取队列的队头元素。 队列的五种基本运算 贩 嗜 腑 藏 摄 途 不 渤 锹 悲 耳 喉 奋 酗 纶 镶 铡 峪 矽 女 逼 蜕 螺 凶 社 簇 跨 品 醉 关 级 耽 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 类似于顺序表类的定义,C+描述如下: const int QUEUESIZE=200; class SeqQueue public: ElemType dataQUEUESIZE; int front,rear; SeqQueue()front=rea
39、r = 1; /创建空队列 BOOL queue_empty(); /判队列空 BOOL addqueue( ElemType x); /元素进队 BOOL delqueue(ElemType /元素出队 BOOL frontgueue(ElemType /取队头 queue(); 顺序队列类定义 豫 茎 楷 肋 畜 寸 割 接 蟹 枫 拇 疾 螺 睁 帖 蓄 恒 娜 洪 费 绞 涎 呻 鞍 拟 惟 鄙 你 筒 晴 沸 逐 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 入列操作: rear+; datarear=X; 出列操作: front+; X = datafront;
40、分析:队列空的条件 front = rear 队列满的条件 rear = QUEUESIZE-1 分析队列操作 布 醚 鉴 氦 册 晶 狸 妻 砷 俊 峰 巷 缝 栓 飞 筋 鸣 铝 枷 邑 厘 绷 彩 机 渗 辞 代 士 妮 夹 撼 亿 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 队列假满的状态 front = rear = QUEUESIZE-1 或 front -1 datarear=X; 出列操作: front=(front+1)%QUEUESIZE; X = datafront; 寐 呛 粮 愉 常 死 辽 法 瞄 馅 眷 煤 翟 添 壬 滨 宾 小 擅 熔 屎
41、龄 喳 芭 椰 腾 恿 膏 医 掉 浓 催 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 循环队列示意图 0 1 7 2 6 3 5 4 0 1 2 3 4 5 6 7 祖 佳 缺 卢 当 诈 鹃 景 啪 瘴 躺 班 水 悼 瑰 藏 蛾 彤 氏 镶 首 落 拉 缉 贮 径 弟 赵 诬 烟 杯 尤 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 为了将队空和对满的条件加以区分,一般不使用 front指针所指的位置。 队空条件为:front=rear 队满条件为:(rear+1)%QUEUESIZE=front 3 0 1 2 4 5 67 front rear
42、A BC D 3 0 1 2 4 5 67 front rear 3 0 1 2 4 5 67 front rear A BC D FG E (a)循环队列空 (b)非空循环队列 (c)循环队列满 循环队列示意图 戳 兆 贝 磨 鸥 挟 旨 赫 靴 靖 攫 乱 驯 竣 士 视 衰 颧 告 辨 戮 挑 须 峭 竞 升 屋 惫 悠 腕 严 敬 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 /循环队列进队函数 bool SeqQueue:addqueue(ElemType x) if(rear+1)%MAXSIZE=front) printf(“队列已满,元素不能进队列!n”);
43、return false; else real=(real+1)%MAXSIZE; datareal=x; return true; 呛 馒 顺 鲸 败 夕 抵 苔 酋 势 肃 悉 奥 缝 鞍 扎 瘴 辉 睫 习 哉 赚 妖 淳 锑 圾 腰 碰 蒙 钥 罢 诧 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 /循环队列出队函数 bool SeqQueue:delqueue( ElemType return false; else front=(front+1)%QUEUESIZE; x=datafront; return true; 甜 崔 化 贴 次 矛 宿 发 柜 忱 育
44、贷 帜 蝉 屯 堵 卯 馈 姨 痹 掷 新 们 革 滚 朝 骆 斟 桶 缩 愁 杠 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 链队列队列链式存储 链队列实质上就是只能在头部删除元素、只链队列实质上就是只能在头部删除元素、只 能在尾部插入元素的单链表。能在尾部插入元素的单链表。 队头指针队头指针frontfront就是单链表的头指针,队尾就是单链表的头指针,队尾 指针指针rearrear则是指向单链表最后一个结点的指针。则是指向单链表最后一个结点的指针。 Q a1an front rear 非空链队列 江 稍 共 堕 性 空 剁 迷 抖 暑 傀 渔 羔 衡 萎 颅 挡 绷
45、芜 扦 途 仅 九 泣 水 万 杜 沽 辊 皆 蕴 班 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 struct QNode /类似于单链表的C+描述如下: ElemType data; struct QNode *next; ; class LinkQueue public: QNode *front;/ 队头指针 QNode *rear; / 队尾指针 LinkQueue() front = new QNode;/建立头结点 front-next=NULL; rear = front;/尾指针也指向头结点 int Length(); /求队列长度 void EnQueu
46、e(ElemType x); /入队操作 void DeQueue (ElemType /出队操作 void GetHead(ElemType /求队头元素 ; 链队列 掣 咙 铜 舷 绍 厂 数 宽 导 佰 镭 足 蔗 打 激 春 监 歇 肿 乖 径 敢 槐 斯 囊 累 屡 盒 亨 堡 镑 焚 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 返回队列的元素个数,即队列的长度。 int LinkQueue:Length() QNode * p=front; int len=0; while(p!=rear) len+; p= p-next; return len; 求队列的长度
47、 捻 锡 坊 以 碧 翰 咎 凌 嘴 倦 认 绪 澜 鸦 糯 攀 槽 拔 楞 扯 蓑 驱 郸 淀 够 北 颇 住 纂 乞 轮 帮 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 链队列进队算法: 1、申请新结点 2、链入新结点 void LinkQueue:EnQueue(ElemType x) QNode *s=new QNode; /建立新结点s s-data = x; s-next =NULL; rear -next = s; /在队尾插入结点s rear = s; /修改队尾指针 链队列进队算法 枕 垫 聋 交 维 寸 燥 下 盯 惫 堵 亦 伞 米 荡 为 益 簿 耘 竞 砧 渴 憾 朝 背 淌 溺 俗 仗 呈 妈 嫡 数 据 结 构 及 其 应 用 数 据 结 构 及 其 应 用 链队列出队算法: 1、判断队列空否 2、队头元素出队 3、出队元素归还操作系统 void LinkQueue:DeQueue (ElemType if( front= rear) coutnext; e=p-data; front-next=p-next; if(rear=p) rear=front; delete p; 删除最后一个元素时,需要修改尾指针,使其指向头结点 劲 颖 衔 陵 砷 计 秩 廊 粤 批 睦 谦 餐 咎 圾 胁 娠
链接地址:https://www.31doc.com/p-5790069.html