常宝宝 北京大学计算机科学与技术系 chbb@pku.edu.cn 数据结构(三) 常宝宝 北京大学计算机科学与技术系 chbb@pku.edu.cn.

Slides:



Advertisements
Similar presentations
動畫與遊戲設計 Data structure and artificial intelligent
Advertisements

第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
Chapter 3: Stack.
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
佇列 (Queue).
佇列與推疊 (Queue and Stack)
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
Chap 3 堆疊與佇列 Stack and Queue.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
哈夫曼编码.
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第3章 栈和队列(二) 1/.
Lecture 1 STL Primer.
演算法與資料結構 製作單位: 高雄市立高雄中學.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
堆疊 Stack chapter 4 德明科技大學資訊科技系.
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第3章 栈和队列(一).
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
第 六 章 鏈結串列(Link List) 課程名稱:資料結構 授課老師:________ 2019/1/2.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
第一章 绪论.
五、链 表 1、单链表 2、双向链表 3、链表应用.
佇列(queue) Lai Ah Fur.
第三章 栈和队列.
$10 可空类型.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
Chapter6 队列(Queues) The Abstract Data Type
Animation(動畫) 靜宜大學資工系 蔡奇偉 副教授
10 多載函數 10.1 多載概論 多載一般函數 多載成員函數 10-3
二叉树的遍历.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
程式結構&語法.
C#程序设计基础 $3 成员、变量和常量.
top b top a a top 空栈 a 进栈 b 进栈 top top e e e top d d d c c c b b b a a
Linked Lists Prof. Michael Tsai 2013/3/12.
Chap2 Stack & Queue.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
第二章 Java语法基础.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C++程序设计 吉林大学计算机科学与技术(软件)学院.
第 六 讲 栈和队列(一).
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第 8 章 标准模板库STL 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
Chapter 2 Entity-Relationship Model
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C++程序语言设计 Chapter 14: Templates.
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
13-1 電腦可以協助解決哪些問題 13-2 電腦解題簡介 13-3 電腦解題規劃-演算法 13-4 認識資料結構
Presentation transcript:

常宝宝 北京大学计算机科学与技术系 chbb@pku.edu.cn 数据结构(三) 常宝宝 北京大学计算机科学与技术系 chbb@pku.edu.cn

内容提要 栈 队列 栈和队列是两种特殊的线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表。 栈和队列广泛地应用在各种软件系统中,是程序设计中必须掌握的两种基本数据结构。

什么是栈? 若限定仅在线性表的一端进行插入和删除操作,这样的线性表称为栈。 能够进行插入和删除操作的一端称为栈顶。另一端则相应称为栈底。 位于栈顶的元素称为栈顶元素,位于栈底的元素称为栈底元素。 不含任何元素的栈称为空栈。 栈的特点是后进先出。 (Last In First Out: LIFO) 上溢和下溢

和栈有关的操作 和栈有关的操作: 构造一个不含任何元素的空栈 判断栈是否为空栈 判断栈是否满 返回栈中的元素个数 清空栈 向栈顶压入(添加)一个元素 从栈顶弹出(删除)一个元素 读取栈顶元素

栈作为抽象数据类型 template <typename stack_entry> class Stack { public: enum error_code { success, overflow, underflow}; protected: ... public: //操作 Stack(); Stack(const Stack& copy); ~Stack(); bool empty() const; bool full() const; int size(); void clear(); error_code push(const stack_entry& item); error_code pop(); error_code top(stack_entry& item) const; };

栈操作 Stack<stack_entry>::Stack(); // PRECONDITION: // POSTCONDITION: 建立了一个空栈 error_code① Stack<stack_entry>::pop(); // PRECONDITION: 栈非空 // POSTCONDITION: 栈顶部的元素被删除 // REMARKS: 若栈非空,栈顶元素被删除,若栈是空栈,返回错误代码underflow error_code Stack<sack_entry>::push(const stack_entry& item); // PRECONDITION: 栈未满 // POSTCONDITION: 元素item被加入到栈的顶部 // REMARKS: 若栈未满,元素item被加入到栈的顶部,若栈已满,返回overflow ① 在实际实现时,error_code 应写作 Stack<stack_entry>::error_code

栈操作 error_code Stack<stack_entry>::top(stack_entry& item) const; // PRECONDITION: 栈非空 // POSTCONDITION: 栈的状态未发生变化 // REMARKS: 若栈非空,栈顶元素被读入item中,若栈是空栈,返回错误 // 代码underflow bool Stack<stack_entry>::empty() const; // PRECONDITION: // POSTCONDITION: 栈的状态未发生变化 // REMARKS: 若栈是空栈,返回true,若栈不是空栈,返回false

栈结构的使用 int main() { Stack<int> intStack; //创建一个元素类型是整数的空栈 int n,item; cout << “Type in an integer n followed by n numbers” << endl; cin >> n; for (int i=0; i<n; i++ ) { cin >> item; intStack.push(item); //将整数item压入栈中 } cout << endl; while ( !intStack.empty() ) { //判断栈是否空栈 intStack.top(item); //读取位于栈顶的整数 cout << item << “ “; intStack.pop(); //将栈顶的整数弹出 } cout << endl; }

栈的实现 —顺序存储 和线性表类似,栈也有两种存储结构: (1) 顺序存储 (2) 链式存储。 和线性表类似,栈也有两种存储结构: (1) 顺序存储 (2) 链式存储。 顺序存储: 用一组连续的存储单元依次存放自栈底到栈顶的数据元素。

栈的实现 —顺序存储 template <typename stack_entry, int max_entry=100> class Stack { public: enum error_code { success, overflow, underflow}; protected: int count; stack_entry entry[max_entry]; public: //操作 Stack(); Stack(const Stack& copy); ~Stack(); bool empty() const; ... error_code push(const stack_entry& item); error_code pop(); error_code top(stack_entry& item) const; };

栈的实现 —顺序存储 template <typename stack_entry, int max_entry> Stack<stack_entry, max_entry>::Stack() { count = 0; } template <typename stack_entry, int max_entry> Stack<stack_entry, max_entry>::error_code Stack<stack_entry, max_entry>::pop() { if ( count == 0 ) return underflow; count--; return success; } template <typename stack_entry, int max_entry> Stack<stack_entry, max_entry>::error_code Stack<stack_entry, max_entry>::push(const stack_entry& item){ if ( count == max_entry ) return overflow; entry[count++]=item; return success; }

栈的实现 —顺序存储 template <typename stack_entry, int max_entry> Stack<stack_entry, max_entry>::error_code Stack<stack_entry, max_entry>::top(stack_entry& item) const { if ( count == 0 ) return underflow; item=entry[count-1]; return success; } x template <typename stack_entry, int max_entry> bool Stack<stack_entry, max_entry>::empty() const { if ( count == 0 ) return true; return false; }

栈的实现 —链式存储 在栈的链式实现中,栈被组织成一个链表。 栈顶指针 在链式存储的栈中: (1) 压入元素 (2) 弹出元素

栈的实现 —链式存储 template <typename stack_entry> class Stack { public: enum error_code { success, overflow, underflow}; protected: struct node { stack_entry entry; node *next; node():next(0) {} node(const stack_entry &se, node* link= NULL):entry(se), next(link) {} }; node* top_node; public: //操作 Stack(); ... error_code pop(); error_code top(stack_entry& item) const; };

栈的实现 —链式存储 template <typename stack_entry> Stack<stack_entry>::Stack() { top_node = NULL; } template <typename stack_entry> Stack<stack_entry>::error_code Stack<stack_entry>::pop() { if (top_node == NULL) return underflow; node* oldtop = top_node; top_node = top_node->next; delete oldtop; return success; } template <typename stack_entry> Stack<stack_entry>::error_code Stack<stack_entry>::push(const stack_entry& item){ node* newtop = new node(item, top_node); if ( newtop == NULL ) return overflow; top_node = newtop; return success; }

栈的实现 —链式存储 template <typename stack_entry> Stack<stack_entry>::error_code Stack<stack_entry>::top(stack_entry& item) const { if ( top_node == 0 ) return underflow; item=top_node->entry; return success; } x template <typename stack_entry> bool Stack<stack_entry>::empty() const { if ( top_node == NULL ) return true; return false; }

什么是队列? 若限定线性表仅能在一端进行插入,另一端进行删除,这样的线性表称为队列。 能够进行插入的一端称为队尾。能够进行删除的一端称为队头。 位于队尾的元素称为队尾元素,位于队头的元素称为队头元素。 不含任何元素的队列称为空队列。 队列的特点是先进先出。(First In First Out: FIFO)

和队列有关的操作 和队列有关的操作: 构造一个不含任何元素的空队列 判断队列是否空队列 判断队列是否满 返回队列中的元素个数 清空队列 在队尾加入一个元素 删除位于队头的元素 读取队头元素

队列作为抽象数据类型 template <typename queue_entry> class Queue { public: enum error_code { success, overflow, underflow}; protected: ... public: //操作 Queue(); Queue(const Queue& copy); ~Queue(); bool empty() const; bool full() const; int size() const; void clear(); error_code append(const queue_entry& x); error_code serve(); error_code retrieve(queue_entry& x) const; };

队列的使用 int main() { Queue<int> intQueue; //创建一个整型空队列 int x; for (int i = 0; i<10; i++ ) intQueue.append(i); //在队列尾部插入整数 while (!intQueue.empty()) { //判断队列是否空队列 intQueue.retrieve(x); //读取队列头部的元素 cout << x << “ ”; intQueue.serve(); //删除队列头部的元素 } cout << endl; }

队列的实现 —顺序存储 在队列的顺序实现中,用一组连续的存储单元存储队列中的元素。 (1) 队头固定 (2) 队头、队尾均不固定 (3) 循环数组 防止“假溢出” 已分配空间 未分配空间

队列的实现 —顺序存储 template <typename queue_entry, int max_entry=100> class Queue { public: enum error_code { success, overflow, underflow}; protected: int count; int front, rear; queue_entry entry[max_entry]; public: //操作 Queue(); Queue(const Queue& copy); ~Queue(); bool empty() const; bool full() const; int size() const; void clear(); error_code append(const queue_entry& x); error_code serve(); error_code retrieve(queue_entry& x) const; }; template <typename stack_entry, int max_entry=100> class Stack { public: enum error_code { success, overflow, underflow}; protected: int count; stack_entry entry[max_entry]; public: //操作 Stack(); Stack(const Stack& copy); ~Stack(); bool empty() const; error_code push(const stack_entry& item); error_code pop(); error_code top(stack_entry& item) const; };

队列的实现 —顺序存储 template <typename queue_entry, int max_entry> Queue<queue_entry, max_entry>::Queue() { count=0; rear=max_entry-1; front=0; } template <typename queue_entry, int max_entry> bool Queue<queue_entry, max_entry>::empty() const { if ( count==0 ) return true; return false; } template <typename queue_entry, int max_entry> Queue<queue_entry, max_entry>::error_code Queue<queue_entry, max_entry>::append(const queue_entry& x) { if ( count==max_entry ) return overflow; count++; rear = (rear+1)%max_entry; entry[rear]=x; return success; }

队列的实现 —顺序存储 template <typename queue_entry, int max_entry> Queue<queue_entry, max_entry>::error_code Queue<queue_entry, max_entry>::serve() { if ( count == 0 ) return underflow; count--; front = (front+1)%max_entry; return success; } template <typename queue_entry, int max_entry> Queue<queue_entry, max_entry>::error_code Queue<queue_entry, max_entry>::retrieve(queue_entry& x) const { if ( count == 0 ) return underflow; x = entry[front]; return success; }

队列的实现 —链式存储 在队列的链式实现中,队列被组织成一个链表。 队头指针和队尾指针 在链式存储的队列中:(1) 插入元素 (2) 删除出元素

队列的实现 —链式存储 template <typename queue_entry> class Queue { public: enum error_code { success, overflow, underflow}; protected: struct node { queue_entry entry; node *next; node():next(0) {} node(const queue_entry &qe, node* link= NULL):entry(qe), next(link) {} }; node *front, *rear; public: //操作 Queue(); ... error_code append(const queue_entry& x); error_code serve(); error_code retrieve(queue_entry& x) const; };

队列的实现 —链式存储 template <typename queue_entry> Queue<queue_entry>::Queue():front(NULL),rear(NULL) {} template <typename queue_entry> bool Queue<queue_entry>::empty() const { if ( front==NULL ) return true; return false; } template <typename queue_entry> Queue<queue_entry>::error_code Queue<queue_entry>::append(const queue_entry& x) { node* newrear = new node(x); if ( newrear==NULL ) return overflow; if ( rear==NULL ) front=rear=newrear; else { rear->next = newrear; rear = newrear; } return success; }

队列的实现 —链式存储 template <typename queue_entry> Queue<queue_entry>::error_code Queue<queue_entry>::serve() { if ( front == NULL ) return underflow; node* oldfront = front; front = front->next; if ( front==NULL ) rear = NULL; delete oldfront; return success; } template <typename queue_entry> Queue<queue_entry>::error_code Queue<queue_entry>::retrieve(queue_entry& x) const { if ( front == 0 ) return underflow; x = front->entry; return success; }

上机作业 在机器上用C++分别实现顺序存储和链式存储的栈结构。 在机器上用C++分别实现顺序存储和链式存储的队列结构。 在实现链式存储的栈结构和队列结构时,必须提供析构函数、拷贝构造函数和赋值运算符重载函数,为什么?