第4章 栈、队列和递归[72页]
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
boolean isEmpty(); //判空
void push(T x); //x入栈
T peek();
//返回栈顶,未出栈
T pop();
//出栈,返回栈顶
}
Stack<T>
栈接口
实现
实现
SeqStack<T> 顺序栈类
LinkedStack<T> 链式栈类
《数据结构与算法(Java版)(第5版)》第4章 6
▪ 重点难点实验:栈和队列设计,使用栈或队列 求解复杂应用问题;递归算法设计。
《数据结构与算法(Java版)(第5版)》第4章 2
§4.1 栈
4.1.1 栈的定义及抽象数据类型 4.1.2 栈的存储和实现 4.1.3 栈的应用
2. 使用栈以非递归方式实现递归算法 【例4.2】算术表达式求值,使用栈。
public final class SeqStack<T> implements Stack<T>
{ private SeqList<T> list; //顺序表
public SeqStack(int capacity) //构造空栈
public SeqStack()
//构造空栈
public boolean isEmpty() public void push(T x) public T peek() public T pop() }
【习题解答4-4】使用单链表对象作为 栈成员变量的操作效率分析
入栈,头插入,list.insert(0,x); O(1)
list.head
a0
…
an-1 ∧
出栈,头删除,list.remove(0); O(1) 头插入,list.insert((0,xa);)O(1头) 插入和头删除
入栈,尾插入,list.insert(x); O(n)
《数据结构与算法(Java版)(第5版)》第4章 10
链式栈类LinkedStack<T>
//链式栈类,最终类,实现栈接口,T表示元素类型 public final class LinkedStack<T>
implements Stack<T>
{ private SinglyList<T> list; //单链表
第4章 栈、队列和递归
4.1 栈 4.2 队列 4.3 递归 习题4(1)栈
《数据结构与算法(Java版)(第5版)》第4章 1
第4章 栈、队列和递归
▪ 目的: ① 栈和队列的实现和应用。 ② 递归定义问题及求解的递归算法设计。
▪ 内容要求:栈和队列的顺序和链式存储结构 实现及应用,递归算法设计。
3 2 1 0 (e)全部出栈
【思考题4-1】 入栈{A, B, C, D},出栈{A, B, C, D}、{D, C, B, A}? 还有哪些?有哪些不可能的出栈序列?为什么?
《数据结构与算法(Java版)(第5版)》第4章 5
2. 栈抽象数据类型ADT,栈接口
public interface Stack<T>
图4.1 栈(顺序栈)及其状态变化
{A, B, C, D} {入栈, 入栈, 出栈, 入栈, 入栈, 出栈, 出栈, 出栈}
A, B
B C, D
D, C, A
3 2 1 0 (a)空栈
3 2 top 1 B 0A (b)A, B 入栈
3 2 1 top 0 A (c)B出栈
3 top 2 D
1C 0A (d)C, D 入栈
n-1 an-1 …
length-1
序号 顺序表list 0 a0
(a) 尾插入和尾删除
出栈,头删除,O(n) list.remove(0);
1 a1
……
出栈,尾删除,O(1) list.remove(list.size()-1);
n-1 an-1 …
length-1
(b) 头插入和头删除,Байду номын сангаас率太低,放弃
《数据结构与算法(Java版)(第5版)》第4章 9
2. 链式栈
top
data next
top==null x
an-1 原栈顶
… a0 ∧
top
新栈顶
(a)空栈
(b)x入栈,单链表头插入
a0 ∧ 插入
top
an-1
原栈顶
an-2 新栈顶
… a0 ∧
(c)出栈,单链表头删除
图 链式栈的入栈和出栈操作
《数据结构与算法(Java版)(第5版)》第4章 3
§4.1.1 栈的定义及抽象数据类型
1. 栈的定义 栈(stack)是特殊线性表,插入和删除操作只允许在
线性表的一端(栈顶)进行。 特点是后进先出(Last In First Out),先进后出。
《数据结构与算法(Java版)(第5版)》第4章 4
//判空 //x入栈 //返回栈顶(未出栈) //出栈,返回栈顶元素
《数据结构与算法(Java版)(第5版)》第4章 8
【习题解答4-4】使用顺序表对象作为
栈成员变量的操作效率分析
入栈,头插入,O(n) list.insert(0,x);
序号 顺序表list
0 a0
1 a1 ……
入栈,尾插入,O(1) list.insert(x);
1. 栈是嵌套调用机制的实现基础
public static void main(String[] args) {
Stack<String> stack = new LinkedStack<String>(); }
a0
…
an-1 ∧
list.head
a0
…
an-1 ∧
,头删除,list.remove(0); O(1) (a) 头插入和头删除
出栈,尾删除,list.remove(list.size()-1); 两次遍历,O(n) (b) 尾插入和尾删除
《数据结构与算法(Java版)(第5版)》第4章 12
§4.1.3 栈的应用
【习题4-3】
习4-3 能否使用一个线性表对象作为栈,或将栈 声明为继承线性表?入栈调用insert(0,x)函数, 出栈调用remove(0)函数?为什么?
【习题解答】都不能。
《数据结构与算法(Java版)(第5版)》第4章 7
§4.1.2 栈的存储和实现
1. 顺序栈 //顺序栈类,最终类,实现栈接口,T表示元素类型
public LinkedStack()
//构造空栈
public boolean isEmpty() //判空
public void push(T x) //x入栈
public T peek()
//返回栈顶(未出栈)
public T pop()
//出栈,返回栈顶元素
}
《数据结构与算法(Java版)(第5版)》第4章 11