栈的基本概念
栈是一种特殊的线性表,其插入、删除操作只能在表的尾部进行。在栈中允许进行插入、删除操作的一端称为栈顶,另一端称为栈底。
通常,栈的插入操作叫入栈,栈的删除操作叫出栈。
栈的抽象数据类型描述
栈中的数据元素和数据间的逻辑关系与线性表相同,是由n个具有相同数据类型的数据元素构成的有限序列
栈的抽象数据Python抽象类包含了栈的主要基本操作,如果要使用这个类还需要具体的类来实现。
栈的Python抽象类的实现方法主要有以下两种。
(1) 基于顺序存储的实现,为顺序栈;
(2) 基于链式存储的实现,为链栈。
顺序栈与链栈
顺序栈用数组实现,因为入栈和出栈操作都是在栈顶进行,所以增加变量top来指示栈顶元素的位置,top指向栈顶元素存储位置的下一个存储单元的位置,空栈时top=0。
顺序栈的入栈操作
顺序栈的出栈操作
利用顺序栈实现括号匹配的语法检查。
解:
括号匹配是指程序中出现的括号,左、右括号的个数是相同的,并且需要先左后右依次出现。括号是可以嵌套的,一个右括号与其前面最近的一个左括号匹配,使用栈保存多个嵌套的左括号。
链栈
采用链式存储结构的栈称为链栈,由于入栈和出栈只能在栈顶进行,不存在在栈的任意位置进行插入和删除的操作,所以不需要设置头结点,只需要将指针top指向栈顶元素结点,每个结点的指针域指向其后继结点即可。
实现IStack抽象类的链栈类的Python语言描述
链栈的入栈操作
链栈的出栈操作
分析可得,使用单链表实现栈,入栈和出栈操作的实现为单链表的头插入和头删除,时间复杂度为O(1)。
队列的基本概念
队列的抽象数据类型描述
队列中的数据元素和数据间的逻辑关系与线性表相同,是由n个具有相同数据类型的数据元素构成的有限序列
队列的抽象数据Python抽象类包含了队列的主要基本操作,如果要使用这个接口,还需要具体的类来实现。Python抽象类的实现方法主要有以下两种。
(1) 基于顺序存储的实现,为顺序队列。
(2) 基于链式存储的实现,为链队列。
顺序队列、链队列与优先级队列
顺序队列
循环队列
链队列
优先级队列
在此优先队级列中,数据元素的优先级别依据优先数的大小进行判定,即优先数越小优先级别越大。
例题:
栈和队列的比较
(1) 栈是一种特殊的线性表,它只允许在栈顶进行插入和删除操作,具有后进先出的特性,各种运算的时间复杂度为O(1)。栈采用顺序存储结构或者链式存储结构。
(2) 队列是一种特殊的线性表,它只允许在表头进行删除操作、在表尾进行插入操作,具有先进先出的特性,各种运算的时间复杂度为O(1)。队列采用顺序存储结构或者链式存储结构。
(3) 循环队列是将顺序队列的首尾相连,解决“假溢出”现象的发生。
(4) 优先级队列是在普通队列的基础之上将队列中的数据元素按照关键字的值进行有序排列。在表头进行删除操作,插入操作按照优先级插入到队列的合适位置。