04-链栈和链队列分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
struct node
{ }; elementtype data; // 元素字段 node * next; // 指针字段
data
next
node类型
不特别说明的情况下,链栈就是采用动态链表来存储,就是链 栈。
合肥工业大学 计算机与信息学院
10
4.2 链栈
4.2.2链栈结构及描述 可以用链表来存储栈: 表头存储栈顶元素; 设一个栈顶指针。如图所示。 top
合肥工业大学 计算机与信息学院
6
4.1 引言
例:阅读下面程序,写出运行结果。 int main() { int *p,*q; p=new int; q=new int; *p=10; *q=20; cout<<*p<<*q<<endl; *p=*q; *q=30; cout<<*p<<*q<<endl; p=q; *p=40; *q=50; cout<<*p<<*q<<endl; delete p; } 输出结果是?
数据结构与算法(C++描述)
阙夏 计算机与信息学院 2018/10/21
合肥工业大学 计算机与信息学院
1
第四章 链栈和链队列
第四章 链栈和链队列
4.1 引言 4.2 链栈 4.3 链队列
合肥工业大学 计算机与信息学院
2
第四章 链栈和链队列
4.1 引言
前面已介绍的顺序栈、顺序队列的有关特性回顾与分析: 运算实现:简单,时间复杂度好。 存储特性:静态规模,编译前确定。 问题:程序的通用性和空间利用率之间的矛盾! 期望:在实际运行过程中,根据实际问题的需要临时确定存 储空间,这就涉及到动态变量。 动态变量:在程序运行过程中产生和释放的变量。 与之相反的是静态变量, 静态变量:在程序运行过程中一直存在的变量。 在一般程序设计语言(如C、C++)中, 静态变量是出现在说明语句中的变量, 而动态变量则由于是在运行过程中产生,因而不会事先说明。 如何实现动态变量? 通过指针来实现:指针变量的说明,动态变量产生和释放 。
8
4.2 链栈
链表存储结构的实现 如何实现链表的存储结构? 对此,可有两类方法,其一是用数组来 实现,其二是用动态链表。 head 1.用数组来存储表中元素------静态链表 =2 就是用数组元素存储表中元素的值, 以及后续元素的地址。 (因而需要说明为构造类型) 例如,右图是一个存储了部分英语字 母的链表。 这类表由于数组的规模事先确定,因 而称为静态链表。 静态链表的不足:难以兼顾到通用性和 存储空间的利用率。 下标 data next
合肥工业大学 计算机与信息学院
3
4.1 引言
下面依次介绍指针变量动态变量的说明,动态变量操作、 产生和释放 。 (1)指针变量说明 例:变量说明语句 int m, n, *p,*q; 说明了4个变量,其中: m和n说明为int型, p,q为指向int型变量的指针,其所指示的变量名称分别 为*p,*q。(动态变量) 指针和其所指示的变量之间的关系如下图所示。
a1 a2 a3 …… an ∧
结构的描述:
数据成员: 除了计数分量count外, 还需要给出栈顶指针top. 函数成员: 原有的函数full()可以不用(为什么?)。 由于链表采用的是动态结构,即使在栈变量的作用域外, 动态变量也不会自行释放。 因此,需要设一个析构函数,以便在栈变量无效时自行释 放链表的存储空间。
合肥工业大学 计算机与信息学院
7
4.2 链栈
4.2.1 链表 为了避免前述的顺序存储方式在的问题规模事先难以确定的问题, 可以将表中元素用链地址连接起来构成一个表。由此而得到链表。 链表:将表中元素用链地址连接起来构成的表。 例如,下图就是一个链表的示意图,其中:
head
头指针
a1
a2
a3
……
an ∧
结点 由若干称为结点的“单元”连接而成。 尾结点 每个结点由两部分组成: 存放元素值的字段 存放下一个结点的地址的字段。 另外,有一个指向表头的指针(头指针)head,指示起点。 最后一个结点(也称为尾结点)的后继指针为空值,表示其后续没 有结点了。 合肥工业大学 计算机与信息学院
p q *p
10
指针和目标变量的关系: 所谓指针指向一个变量,就是存 放着目标变量的地址的值。
合肥工业大学 计算机与信息学院
4
*q
20
4.1 引言
(2)动态变量的操作 基本操作:和其他类型的变量类似,可以对动态变量赋值、引用。 特别要注意区分:指针赋值和动态变量赋值操作的关系和效果。 例如 语句 *p = *q; 和 p = q; 的效果存在明显的差异: 假设初始时*p=10; *q=20; 如图所示。 p q *p
10 20
p
*p
10
*q
20
q
*q
20
*p
*p = *q的效果
p = q的效果
区别:一个是整型变量的赋值, 一个是指针型变量的赋值。
合肥工业大学 计算机与信息学院
5
4.1 引言
(3)动态变量产生 动态变量需要在执行申请变量操作后才能产生,否则无效。 申请变量的操作如下:(对前面给出的变量说明) p=new int; ------产生一个int类型变量,并将该变量的地址放到指针变量p中。 (4)动态变量的释放 释放变量:将动态变量的存储空间还给系统,以便重新分配使用。 释放变量的操作: delete p; -----释放指针p所指示的变量(即*p)的存储空间 (因而使*p无效,除非重新赋值或申请)
合肥工业大学 计算机与信息学院
11
4.2 链栈
由此得类stack的描述如下:
class stack{ public: // 函数成员 stack(); ~stack(); Bool empty()const; Bool full()const; error_code get_top(elementtype &x)const; error_code push(const elementtyoe x); error_code pop(); private: // 数据成员 int count; node * top; //栈顶指针 };
0 1 2 3 4 Fra Baidu bibliotek 6
E D A B C G F
6 0 3 4 1 -1 ∧ 5
合肥工业大学 计算机与信息学院
9
4.2 链栈
2.采用动态变量来实现 —— 动态链表 其中每个结点用一个结构来描述,包括两个字段,
存放元素值的字段data 存放下一个结点的指针 如右图所示。
设结点类型为node, 则类型描述如下:
{ }; elementtype data; // 元素字段 node * next; // 指针字段
data
next
node类型
不特别说明的情况下,链栈就是采用动态链表来存储,就是链 栈。
合肥工业大学 计算机与信息学院
10
4.2 链栈
4.2.2链栈结构及描述 可以用链表来存储栈: 表头存储栈顶元素; 设一个栈顶指针。如图所示。 top
合肥工业大学 计算机与信息学院
6
4.1 引言
例:阅读下面程序,写出运行结果。 int main() { int *p,*q; p=new int; q=new int; *p=10; *q=20; cout<<*p<<*q<<endl; *p=*q; *q=30; cout<<*p<<*q<<endl; p=q; *p=40; *q=50; cout<<*p<<*q<<endl; delete p; } 输出结果是?
数据结构与算法(C++描述)
阙夏 计算机与信息学院 2018/10/21
合肥工业大学 计算机与信息学院
1
第四章 链栈和链队列
第四章 链栈和链队列
4.1 引言 4.2 链栈 4.3 链队列
合肥工业大学 计算机与信息学院
2
第四章 链栈和链队列
4.1 引言
前面已介绍的顺序栈、顺序队列的有关特性回顾与分析: 运算实现:简单,时间复杂度好。 存储特性:静态规模,编译前确定。 问题:程序的通用性和空间利用率之间的矛盾! 期望:在实际运行过程中,根据实际问题的需要临时确定存 储空间,这就涉及到动态变量。 动态变量:在程序运行过程中产生和释放的变量。 与之相反的是静态变量, 静态变量:在程序运行过程中一直存在的变量。 在一般程序设计语言(如C、C++)中, 静态变量是出现在说明语句中的变量, 而动态变量则由于是在运行过程中产生,因而不会事先说明。 如何实现动态变量? 通过指针来实现:指针变量的说明,动态变量产生和释放 。
8
4.2 链栈
链表存储结构的实现 如何实现链表的存储结构? 对此,可有两类方法,其一是用数组来 实现,其二是用动态链表。 head 1.用数组来存储表中元素------静态链表 =2 就是用数组元素存储表中元素的值, 以及后续元素的地址。 (因而需要说明为构造类型) 例如,右图是一个存储了部分英语字 母的链表。 这类表由于数组的规模事先确定,因 而称为静态链表。 静态链表的不足:难以兼顾到通用性和 存储空间的利用率。 下标 data next
合肥工业大学 计算机与信息学院
3
4.1 引言
下面依次介绍指针变量动态变量的说明,动态变量操作、 产生和释放 。 (1)指针变量说明 例:变量说明语句 int m, n, *p,*q; 说明了4个变量,其中: m和n说明为int型, p,q为指向int型变量的指针,其所指示的变量名称分别 为*p,*q。(动态变量) 指针和其所指示的变量之间的关系如下图所示。
a1 a2 a3 …… an ∧
结构的描述:
数据成员: 除了计数分量count外, 还需要给出栈顶指针top. 函数成员: 原有的函数full()可以不用(为什么?)。 由于链表采用的是动态结构,即使在栈变量的作用域外, 动态变量也不会自行释放。 因此,需要设一个析构函数,以便在栈变量无效时自行释 放链表的存储空间。
合肥工业大学 计算机与信息学院
7
4.2 链栈
4.2.1 链表 为了避免前述的顺序存储方式在的问题规模事先难以确定的问题, 可以将表中元素用链地址连接起来构成一个表。由此而得到链表。 链表:将表中元素用链地址连接起来构成的表。 例如,下图就是一个链表的示意图,其中:
head
头指针
a1
a2
a3
……
an ∧
结点 由若干称为结点的“单元”连接而成。 尾结点 每个结点由两部分组成: 存放元素值的字段 存放下一个结点的地址的字段。 另外,有一个指向表头的指针(头指针)head,指示起点。 最后一个结点(也称为尾结点)的后继指针为空值,表示其后续没 有结点了。 合肥工业大学 计算机与信息学院
p q *p
10
指针和目标变量的关系: 所谓指针指向一个变量,就是存 放着目标变量的地址的值。
合肥工业大学 计算机与信息学院
4
*q
20
4.1 引言
(2)动态变量的操作 基本操作:和其他类型的变量类似,可以对动态变量赋值、引用。 特别要注意区分:指针赋值和动态变量赋值操作的关系和效果。 例如 语句 *p = *q; 和 p = q; 的效果存在明显的差异: 假设初始时*p=10; *q=20; 如图所示。 p q *p
10 20
p
*p
10
*q
20
q
*q
20
*p
*p = *q的效果
p = q的效果
区别:一个是整型变量的赋值, 一个是指针型变量的赋值。
合肥工业大学 计算机与信息学院
5
4.1 引言
(3)动态变量产生 动态变量需要在执行申请变量操作后才能产生,否则无效。 申请变量的操作如下:(对前面给出的变量说明) p=new int; ------产生一个int类型变量,并将该变量的地址放到指针变量p中。 (4)动态变量的释放 释放变量:将动态变量的存储空间还给系统,以便重新分配使用。 释放变量的操作: delete p; -----释放指针p所指示的变量(即*p)的存储空间 (因而使*p无效,除非重新赋值或申请)
合肥工业大学 计算机与信息学院
11
4.2 链栈
由此得类stack的描述如下:
class stack{ public: // 函数成员 stack(); ~stack(); Bool empty()const; Bool full()const; error_code get_top(elementtype &x)const; error_code push(const elementtyoe x); error_code pop(); private: // 数据成员 int count; node * top; //栈顶指针 };
0 1 2 3 4 Fra Baidu bibliotek 6
E D A B C G F
6 0 3 4 1 -1 ∧ 5
合肥工业大学 计算机与信息学院
9
4.2 链栈
2.采用动态变量来实现 —— 动态链表 其中每个结点用一个结构来描述,包括两个字段,
存放元素值的字段data 存放下一个结点的指针 如右图所示。
设结点类型为node, 则类型描述如下: