收藏 分享(赏)

第3章数据结构.ppt

上传人:dreamzhangning 文档编号:5753183 上传时间:2019-03-15 格式:PPT 页数:116 大小:3.01MB
下载 相关 举报
第3章数据结构.ppt_第1页
第1页 / 共116页
第3章数据结构.ppt_第2页
第2页 / 共116页
第3章数据结构.ppt_第3页
第3页 / 共116页
第3章数据结构.ppt_第4页
第4页 / 共116页
第3章数据结构.ppt_第5页
第5页 / 共116页
点击查看更多>>
资源描述

1、1 栈 队列 栈的应用:表达式求值 栈的应用:递归 队列的应用:打印杨辉三角形 优先级队列 第三章 栈与队列 2 3.1.1 栈的定义 只允许在 一端 插入和删除的线性表。 允许插入和删除的一端称为 栈顶 (top),另一端称为栈底 (bottom) 特点 后进先出 (LIFO) 3.1 栈 ( Stack ) 退栈 进栈 a0 an-1 an-2 top bottom 3 class Stack /栈的类定义 public: Stack() ; /构造函数 Stack() ; virtual void Push(DataType /进栈 virtual bool Pop(DataType /

2、出栈 virtual bool getTop(DataType /取栈顶 virtual bool IsEmpty(); /判栈空 virtual bool IsFull(); /判栈满 ; 栈的抽象数据类型 栈的抽象数据类型有两种典型的存储表示,基于数组的存储表示实现的栈称为 顺序栈 ,基于链表的存储表示实现的栈称为 链式栈 。 4 typedef int DataType; class SeqStack /顺序栈类定义 private: DataType *elements; /栈元素存放数组 int top; /栈顶指针 int maxSize; /栈最大容量 栈的数组存储表示 顺序栈

3、0 1 2 3 4 5 6 7 8 9 maxSize-1 top (栈空 ) elements 5 void overflowProcess(); /栈的溢出处理 public: SeqStack(int sz =50); /构造函数 SeqStack() delete elements; /析构函数 void Push(DataType /进栈 bool Pop(DataType /出栈 bool getTop(DataType /取栈顶内容 bool IsEmpty() const return top = -1; bool IsFull() const return top = max

4、Size-1; int getSize() const return top+1; void MakeEmpty()top=-1; friend ostream assert(elements!=NULL); top=-1; maxSize=sz; 断言( assert)机制是 C+提供的一种功能,若参数表中给定的条件满足,则继续执行后续的语句;否则出错处理终止程序的执行。 9 顺序栈的溢出处理 void SeqStack:overflowProcess() /私有函数:当栈满则执行扩充栈存储空间处理 DataType *newArray = new DataType 2*maxSize;/创

5、建更大的存储数组 for (int i = 0; i 清空栈操作 void LinkedStack:makeEmpty( ) /逐次删去链式栈中的元素直至栈顶指针为空。 StackNode *p; while (top != NULL) /逐个结点释放 p = top; top = top-link; delete p; ; top top 20 入栈操作 void LinkedStack:Push(DataType /创建新结点 assert (top != NULL); /创建失败退出 ; 出栈操作 bool LinkedStack:Pop(DataType /栈空返回 StackNode

6、 *p = top; /暂存栈顶元素 top = top-link; /退栈顶指针 x = p-data; delete p; /释放结点 return true; ; top x 21 取栈顶元素 bool LinkedStack:getTop(DataType /栈空返回 x = top-data; /返回栈顶元素的值 return true; ; ostream return os; ; top 22 问题:当进栈元素的编号为 1, 2, , n 时,可能的出栈序列有多少种? 关于栈的进一步讨论 23 设进栈元素数为 n,可能出栈序列数为 mn: n = 0, m0 = 1: 出栈序列

7、。 n = 1, m1 = 1: 出栈序列 1。 n = 2, m2 = 2: = m0*m1+m1*m0 a) 出栈序列中 1在 第 1位 。 1进 1出 2进 2出, 出栈序列为 1, 2。 = m0*m1= 1 b) 出栈序列中 1在 第 2位 。 1进 2进 2出 1出, 出栈序列为 2, 1。 = m1*m0 = 1 n = 3, m3 = 5: = m0*m2+m1*m1+m2*m0 a) 出栈序列中 1在 第 1位 。后面 2个元素有 m2 = 2个出栈序列: 1, 2, 3, 1, 3, 2。 24 = m0*m2 = 2 出栈序列中 1在 第 2位 。 1前有 2后有 3,出

8、栈序列为 2, 1, 3。 = m1*m1 = 1 出栈序列中 1在 第 3位 。前面 2个元素有m2 = 2个出栈序列: 2, 3, 1, 3, 2, 1。 = m2*m0 = 2 n = 4, m4 = 14: = m0*m3+m1*m2+m2*m1+m3*m0 a) 出栈序列中 1在 第 1位 。后面 3个元素有m3 = 5个出栈序列: 1, 2, 3, 4, 1, 2, 4, 3, 1, 3, 2, 4, 1, 3, 4, 2, 1, 4, 3, 2。 25 = m0*m3 = 5 b) 出栈序列中 1在 第 2位 。前面有 2,后面3、 4有 m2 = 2个出栈序列 : 2, 1,

9、3, 4, 2, 1, 4, 3。 = m1*m2 = 2 c) 出栈序列中 1在 第 3位 。前面 2、 3有 m2 = 2个出栈序列,后面有 4: 3, 2,1, 4, 2, 3, 1,4。 = m2*m1 = 2 d) 出栈序列中 1在 第 4位 。前面 3个元素有m3 = 5个出栈序列: 2, 3, 4, 1, 2, 4, 3, 1, 3, 2, 4, 1, 3, 4, 2, 1, 4, 3, 2, 1。 = m3*m0 = 5 26 一般地,设有 n 个元素按序号 1, 2, , n 进栈,轮流让 1在出栈序列的第 1, 第 2, 第 n位,则可能的出栈序列数为: 推导结果为: -1

10、n0i01n2n11n01ini m*mm*mm*mm*m C n2n1n0i1ini 1n1m*m算法基于原理: N = (N div d) d + N mod d 3.1.4 栈的应用 -数制转换 例如: ( 1348)10 = (2504)8 ,其运算过程如下: N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 2 计算顺序 输出顺序 思路: 初始化栈 输入要转换的数据 N 当 N不为 0,把 N%8取余入栈 当栈不为空,栈顶元素出栈,输出。 void conversion () SeqStack S; int N; int x=0; bool continue1; cin N; while (N) S.Push( N % 8); N = N/8; continue1=S.Pop(x); while (continue) cout x endl; continue=S.Pop(x); / conversion

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报