数据结构第二章答案【精选】
数据结构第二章课后答案

数据结构第二章课后答案数据结构第二章课后答案1. 线性表1.1 数组实现线性表Q1. 请说明线性表的定义,并结合数组实现线性表的特点进行解释。
线性表是由n(n≥0)个数据元素构成的有序序列,其中n表示线性表的长度。
数组实现线性表的特点是使用一组具有相同数据类型的连续存储空间存储线性表中的元素,通过下标访问和操作元素。
A1. 线性表的定义指出,线性表是由若干个数据元素组成的有序序列。
具体地,在数组实现线性表中,我们将元素存储在一组连续的内存空间中,通过下标访问和操作元素。
由于数组的存储空间具有连续性,这样的实现方式可以在O(1)的时间复杂度下进行元素的访问和修改操作。
1.2 链表实现线性表Q2. 请说明链表实现线性表的特点,并与数组实现进行比较。
链表实现线性表的特点是通过指针将线性表中的元素按照节点的形式连接起来,每个节点包含了存储的元素和指向下一个节点的指针。
与数组实现相比,链表的插入和删除操作更为高效,但是访问某个位置的元素需要从头开始遍历,时间复杂度较大。
A2. 链表实现线性表的特点是通过使用节点和指针将线性表中的元素连接起来。
每个节点中包含了一个存储的元素和指向下一个节点的指针。
链表的插入和删除操作的时间复杂度为O(1),因为只需要改变指针的指向即可。
但是,访问某个位置的元素需要从头开始遍历链表,所以时间复杂度为O(n)。
2. 栈和队列2.1 栈的定义和基本操作Q3. 请给出栈的定义和基本操作。
栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作,该端称为栈顶。
栈的基本操作包括入栈(push)和出栈(pop),分别用于将元素压入栈和将栈顶元素弹出。
A3. 栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。
这个特定的一端称为栈顶,而另一端称为栈底。
栈的基本操作包括入栈(push)和出栈(pop)。
入栈操作将一个元素压入栈顶,出栈操作将栈顶元素弹出。
2.2 队列的定义和基本操作Q4. 请给出队列的定义和基本操作。
数据结构练习题第二章答案

数据结构练习题第二章答案一、选择题1. 在数据结构中,线性结构的特点是什么?A. 元素之间存在一对一的关系B. 元素之间存在一对多的关系C. 元素之间存在多对多的关系D. 元素之间存在一对一或一对多的关系答案:D2. 栈(Stack)是一种特殊的线性表,其特点是:A. 允许在表的一端进行插入和删除操作B. 允许在表的两端进行插入和删除操作C. 只能在表的两端进行插入和删除操作D. 只能在表的中间进行插入和删除操作答案:A3. 队列(Queue)与栈的主要区别在于:A. 队列是先进先出(FIFO),栈是先进后出(LIFO)B. 栈是先进先出(FIFO),队列是先进后出(LIFO)C. 队列和栈都是先进先出(FIFO)D. 队列和栈都是先进后出(LIFO)答案:A二、简答题1. 什么是链表?链表有哪些基本操作?答案:链表是一种由一系列节点组成的线性数据结构,每个节点包含数据部分和指向下一个节点的指针。
链表的基本操作包括插入节点、删除节点、查找节点和遍历链表。
2. 线性表的顺序存储结构和链式存储结构有何区别?答案:顺序存储结构使用连续的存储单元来存储数据元素,如数组。
链式存储结构不要求数据元素在存储空间中连续,每个元素包含指向下一个元素的指针,如链表。
三、编程题1. 编写一个函数,实现在单链表中插入一个新节点到指定位置。
```c#include <stdio.h>#include <stdlib.h>typedef struct Node {int data;struct Node *next;} Node;Node* createNode(int data) {Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;return newNode;}void insertNode(Node head, int position, int data) {Node *newNode = createNode(data);if (position == 0) {newNode->next = *head;*head = newNode;} else {Node *current = *head;for (int i = 0; current != NULL && i < position - 1; i++) {current = current->next;}if (current == NULL) return; // Position is greater than the number of nodesnewNode->next = current->next;current->next = newNode;}}int main() {Node *head = NULL;insertNode(&head, 0, 10);insertNode(&head, 1, 20);// Print the list to verify the insertionNode *current = head;while (current != NULL) {printf("%d ", current->data);current = current->next;}return 0;}```四、分析题1. 分析栈的后进先出(LIFO)特性在实际应用中的优势和局限性。
数据结构习题及答案 (2)

第二章线性表一、选择题1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( )(A)110 (B)108(C)100 (D)120参考答案:B2. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。
(A)64(B)63 (C)63.5 (D)7参考答案:C3.线性表采用链式存储结构时,其地址()。
(A) 必须是连续的 (B) 部分地址必须是连续的(C) 一定是不连续的 (D) 连续与否均可以参考答案:D4. 在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行()(A)s->next=p;p->next=s; (B) s->next=p->next;p->next=s;(C)s->next=p->next;p=s; (D)p->next=s;s->next=p;参考答案:B5.在一个单链表中,若删除p所指结点的后续结点,则执行()(A)p->next=p->next->next; (B)p=p->next; p->next=p->next->next;(C)p->next=p->next; (D)p =p->next->next;参考答案:A6.下列有关线性表的叙述中,正确的是()(A)线性表中的元素之间隔是线性关系(B)线性表中至少有一个元素(C)线性表中任何一个元素有且仅有一个直接前趋(D)线性表中任何一个元素有且仅有一个直接后继参考答案:A7.线性表是具有n个()的有限序列(n≠0)(A)表元素(B)字符(C)数据元素(D)数据项参考答案:C二、判断题1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。
()2.如果没有提供指针类型的语言,就无法构造链式结构。
()3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继。
数据结构第二章参考答案

数据结构第二章参考答案1. 线性表线性表是数据结构中最基本的一种结构,在实际应用中广泛使用。
它是一个有序的数据元素序列,其中每个元素都有唯一的前驱和后继,除了第一个元素没有前驱,最后一个元素没有后继。
2. 顺序存储结构顺序存储结构是线性表最简单的一种实现方式。
它利用一段连续的存储空间依次存储线性表的元素,存储位置是连续的。
在顺序存储结构中,插入和删除操作需要移动大量元素,因此效率较低。
3. 链式存储结构链式存储结构通过指针将线性表的各个元素链接起来。
每个元素都包含一个数据域和一个指针域,数据域用于存储数据元素,指针域用于存储下一个元素的地址。
在链式存储结构中,插入和删除操作只需要修改指针,效率较高。
4. 栈栈是一种特殊的线性表,它只允许在表的一端进行插入和删除操作,这一端称为栈顶。
栈的特点是后进先出,即最后插入的元素最先被删除。
栈的应用场景包括函数调用、表达式求值等。
5. 队列队列也是一种特殊的线性表,它允许在表的一端(队尾)插入元素,在另一端(队首)删除元素。
队列的特点是先进先出,即最先插入的元素最先被删除。
队列的应用场景包括进程调度、打印队列等。
6. 递归递归是一种解决问题的方法,通过调用自身来解决规模较小的子问题。
在数据结构中,递归广泛应用于树和图的操作中。
递归需要注意递归的边界条件和递归的停止条件,以避免无限递归的问题。
7. 树树是一种非线性的数据结构,它由n个节点组成,这些节点通过边连接起来。
树的特点是每个节点最多有一个父节点,但可以有多个子节点。
树的应用场景包括文件系统、组织结构等。
8. 二叉树二叉树是一种特殊的树结构,每个节点最多有两个子节点。
二叉树的遍历有三种方式:前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。
二叉树的应用场景包括查找、排序等。
9. 查找算法查找算法是在数据集合中寻找特定元素的过程。
常用的查找算法有顺序查找、二分查找、哈希查找等。
不同的查找算法有不同的时间复杂度和空间复杂度,对于不同规模的数据集合有不同的效率。
数据结构课后习题答案第二章 线性表

第二章线性表2.1描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。
并说明头指针和头结点的作用。
答:头指针是一个指针变量,里面存放的是链表中首结点的地址,并以此来标识一个链表。
如链表H,链表L等,表示链表中第一个结点的地址存放在H、L中。
头结点是附加在第一个元素结点之前的一个结点,头指针指向头结点。
当该链表表示一个非空的线性表时,头结点的指针域指向第一个元素结点,为空表时,该指针域为空。
开始结点指第一个元素结点。
头指针的作用是用来惟一标识一个单链表。
头结点的作用有两个:一是使得对空表和非空表的处理得以统一。
二是使得在链表的第一个位置上的操作和在其他位置上的操作一致,无需特殊处理。
2.2填空题1、在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关。
2、顺序表中逻辑上相邻的元素的物理位置(必定)相邻。
单链表中逻辑上相邻的元素的物理位置(不一定)相邻。
3、在单链表中,除了首元结点外,任一结点的存储位置由(其直接前驱结点的链域的值)指示。
4、在单链表中设置头结点的作用是(插入和删除元素不必进行特殊处理)。
2.3何时选用顺序表、何时选用链表作为线性表的存储结构为宜?答:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有以下几方面的考虑:1.基于空间的考虑。
当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。
2.基于时间的考虑。
若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之,若需要对线性表进行频繁地插入或删除等的操作时,宜采用链表做存储结构。
并且,若链表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。
2.10 Status DeleteK(SqList &a,int i,int k)//删除线性表a中第i个元素起的k个元素{if(i<1||k<0||i+k-1>a.length) return INFEASIBLE;for(count=1;i+count-1<=a.length-k;count++) //注意循环结束的条件a.elem[i+count-1]=a.elem[i+count+k-1];a.length-=k;return OK;}//DeleteK2.11设顺序表中的数据元素递增有序,试写一算法,将X插入到顺序表的适当位置上,以保持该表的有序性。
数据结构第二单元练习题答案【最新】

数据结构第二单元练习题答案一、选择1.树最适合用来表示( )A.有序数据元素B.无序数据元素C.元素之间具有分支层次关系的数据D.元素之间无联系的数据2.在下述结论中,正确的是( )①只有一个结点的二叉树的度为0; ②二叉树的度为2;③二叉树的左右子树可任意交换;④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A.①②③B.②③④C.②④D.①④3.以下说法正确的是( )A.任何一棵二叉树中至少有一个结点的度为2B.任何一棵二叉树中每个结点的度都为2C.任何一棵二叉树的度肯定等于2D.任何一棵二叉树的度可以小于24.在下列情况中,可称为二叉树的是( )A.每个结点至多有两棵子树的树B.哈夫曼树C.每个结点至多有两棵子树的有序树D.每个结点只有一棵右子树E.以上答案都不对5.深度为h的满m叉树的第k层有( )个结点(1=<k=<h)A.m k-1B.m k-1C.m h-1D.m h-16.在一棵高度为k的满二叉树中,结点总数为( )A.2k-1B.2kC.2k-1D.⎣log2k⎦+17.在一棵三元树中度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数为( )个A.4B.5C.6D.78.具有10个叶结点的二叉树中有( )个度为2的结点。
A.8B.9C.10D.ll9.二叉树有n个结点,则其深度为()A.n-1B.nC.(log2n)+`1 D.无法确定该题是二叉树不是完全二叉树由二叉树结点的公式:n=n0+n1+n2=n0+n1+(n0-1)=2n0+n1-1,因为n=1001,所以1002=2n0+n1,在完全二叉树树中,n1只能取0或1,在本题中只能取0,故n=501,因此选E。
10.一个具有1025个结点的二叉树的高h为( )A.11 B.10 C.11至1025之间 D.10至1024之间11.一棵具有 n个结点的完全二叉树的深度是( )A.⎣log2n⎦+1 B.log2n+1 C.⎣log2n⎦ D.log2n-112.将有关二叉树的概念推广到三叉树,则一棵有244个结点的完全三叉树的高度( )A.4B.5C.6D.713.将一棵有100个结点的完全二叉树从根结点这一层开始,每一层上从左到右依次对结点编号,根结点的编号为1,则编号为49的结点的左孩子编号为()A.98B.99C.50D.48利用二叉树的性质514.在完全二叉树中,若一个结点是叶结点,则它没( )A.左子结点B.右子结点C.左子结点和右子结点D.左子结点,右子结点和兄弟结点15.当一棵有n个结点的二叉树按层次从上到下,同层次从左到右将数据存放在一维数组A[l..n]中时,数组中第i个结点的左孩子为( )A.A[2i](2i=<n)B.A[2i+1](2i+1=<n)C.A[i/2]D.无法确定16.在下列存储形式中,( )不是树的存储形式?A.双亲表示法B.孩子链表表示法C.孩子兄弟表示法D.顺序存储表示法17.以下说法错误的是( )A.完全二叉树上结点之间的父子关系可由它们编号之间的关系来表达B.三叉链表,二叉树求双亲运算很容易实现C.在二叉链表上,求左.右孩子等很容易实现D.在二叉链表上,求双亲运算的时间性能很好18.对二叉树从1开始进行连续编号,要求每个结点的编号大于其左右孩子的编号,同一个结点的左右孩子中,其左孩子的编号小于其右孩子的编号,则可采用()次序的遍历实现编号。
数据结构 第2章 答案(已核)

第2章1. 名词解释(1)线性表具有相同数据类型的n(n>=0)个数据元素的有限序列,排列方式为“一个接一个的排列”。
通常记为:(a1,a2,… a i-1,a i,a i+1,…a n)其中,n为表长,n=0时称为空表。
(2)顺序表用顺序存储方式存放的线性表叫顺序表,顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素。
特点:①用物理上的相邻实现数据元素逻辑关系上的相邻;②可实现随机存取。
(3)线性单链表用链式存储方式存放的线性表叫链表。
链表是通过一组任意的存储单元来存储线性表中的数据元素,对每个数据元素a i,除了存放数据元素的自身的信息a i之外,还需要存放其后继a i+1 所在的存贮单元的地址,这两部分信息组成一个“结点”,存放数据元素信息的称为数据域data,存放其后继地址的称为指针域next。
因此n个元素的线性表通过每个结点的指针域联成了一个“链子”,称之为链表。
其中:线性、单向链结构的叫线性单链表;线性、双向链结构的叫线性双向链表;环形、单向链结构的叫单循环链表;环形、双向链结构的叫双循环链表。
(4)单循环链表在单链表的基础上,链表最后一个结点的指针域不为空,而是指向第一个结点,使得链表头尾结点相连,整个链表形成一个环。
单循环链表特点:从表中任何一个结点出发均可找到其它结点。
(单链表特点:要找链表中任何一个结点,必须从头结点开始遍历该结点以前的整个链表。
)2. 判断题(在各题后填写“√”或“×”)(1) 线性表若采用链式存储表示时所有存储结点之间的地址可连续可不连续( √ )(2) 链式存储在插入和删除时需要保持数据元素原来的物理顺序,不需要保持原来的逻辑顺序。
(×)(3) 链表中每个结点都是两个域。
(×)解析:单链表中每个结点都是两个域,双链表不是两个域。
(4) 在顺序表中,逻辑上相邻的元素在物理位置上不一定相邻。
(×)(5) 顺序表可以按下标随机(或直接)访问,顺序表还可以从某一指定元素开始,向前或向后逐个元素顺序访问。
数据结构第2章习题参考答案

数据结构第2章习题参考答案1. 简答题1.1 什么是数据结构?数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,它包括数据的逻辑结构和物理结构。
1.2 数据结构的分类有哪些?数据结构可以分为线性结构和非线性结构。
线性结构包括线性表、栈、队列和串;非线性结构包括树和图。
1.3 数据结构的逻辑结构有哪些?数据结构的逻辑结构包括线性结构、树形结构和图形结构。
1.4 数据结构的物理结构有哪些?数据结构的物理结构包括顺序存储结构和链式存储结构。
1.5 什么是算法?算法是指求解问题的具体步骤和方法。
1.6 算法的特性有哪些?算法应具有有穷性、确定性、可行性和输入输出性。
2. 选择题2.1 在栈的顺序存储结构中,栈的存储位置是:A. 自顶向下递增B. 自底向上递增C. 自底向上递减D. 自顶向下递减答案:D2.2 下列哪个数据结构不适合表示有父子关系的数据?A. 二叉树B. 图C. 链表D. 堆答案:D2.3 对于一棵完全二叉树,叶子节点的个数为n,则树中节点的总数为:A. 2nB. 2n + 1C. nD. n + 1答案:A2.4 假设有一个长度为10的栈,初始时栈为空,若对该栈连续执行5次入栈操作,然后执行4次出栈操作,最后执行1次入栈操作,则栈中剩余的元素个数为:A. 0B. 1C. 4D. 6答案:D3. 编程题3.1 实现一个栈数据结构的基本操作,包括入栈、出栈、获取栈顶元素和判断栈是否为空。
```Pythonclass Stack:def __init__(self):self.items = []def is_empty(self):return len(self.items) == 0def push(self, item):self.items.append(item)def pop(self):if self.is_empty():return Nonereturn self.items.pop()def peek(self):if self.is_empty():return Nonereturn self.items[-1]```3.2 实现一个队列数据结构的基本操作,包括入队、出队、获取队首元素和判断队列是否为空。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
栈和队列是两种重要的线性结构。
从数据结构上看,栈和队列也是线性表,不过 是两种特殊的线性表。
栈只允许在表的一端进行插入或删除操作。
队列只允许在表的一端进行插入操作、而在另 一端进行删除操作。
因而,栈和队列也可以被称作为操作受限的线 性表。
栈和队列的插入、删除操作与线性表 的插入、删除操作的比较:
…
S.base S.top
S.stacksize
(栈底) (栈顶)
Status Push (SqStack &S, ElemType e) {
if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间
S.base = (ElemType *) realloc ( S.base,
例二、 括号匹配的检验
假设在表达式中 ([]())或[([ ][ ])] 等为正确的格式, [( ])或([( ))或 (()]) 均为不正确的格式。 则 检验括号是否匹配的方法可用“期待的急迫程度 ”这个概念来描述。
例如:考虑下列括号序列: [( [ ][ ] )] 1 2 34 5 6 7 8
a1 a2
…
an e …
}
S.base
S.topS.top
Status Pop (SqStack &S, ElemType &e) {
// 若栈不空,则删除S的栈顶元素,
// 用e返回其值,并返回OK;
// 否则返回ERROR
if (S.top == S.base) return ERROR;
e = *--S.top;
算法见教材 P.53
算法的计算过程: 以表达式: 5+(6-4/22))*33# 为例
/
2
-
342
(*
4 / 2 =2
1642
+
6 - 2 =4
157
#
4 * 3 =12
OPRD
OPTR
5 + 12=17
运算符栈栈顶运算符的优先权?当前运算符的优先权
(运算符间的优先关系请看教材P.53)
1)若为“<”,则将当前运算符压入运算符栈,并依次读 下一个元素。
根据栈的定义可知,栈顶元素总是最后入栈的, 因而是最先出栈;栈底元素总是最先入栈的,因而也 是最后出栈。这种表是按照后进先出(LIFO)的原则 组织数据的,因此,栈也被称为“后进先出”的线性 表。
栈的示意图:
出栈
栈顶
an
top
a2
栈底
a1
bottom
…
入栈 若输入序列是1,2,3,
则可能的输出序列有
(S.staeof (ElemType));
if (!S.base) exit (OVERFLOW); //存储分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
} *S.top++ = e; return OK;
Status matching(string exp) { m= Length(exp) ; i=0; state = 1; while (i<m&& state) {
switch exp[i] { case 左括弧:{Push(S,exp[i]); i++; break;} case ’)’: { if(!StackEmpty(S)&&GetTop(S)== ’(’) {Pop(S,e); i++;} else state = 0; break; } …… }
计 1348 168
4
算
168 21
0
输 出
顺
21 2
5
顺
序
20
2
序
void conversion () {
//输入一个非负的十进制数,输出对应的八进制数
InitStack(S); scanf ("%d",N); while (N) {
Push(S, N % 8); N = N/8; } while (!StackEmpty(S)) { Pop(S,e); printf ( "%d", e ); } } // conversion
Status InitStack (SqStack &S) {// 构造一个空栈S S.base=(ElemType*)malloc(STACK_INIT_SIZE*
sizeof(ElemType)); if (!S.base) exit (OVERFLOW); //存储分配失败 S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; }
哪些? 1,2,3 1,3,2 2,1,3 2,3,1 3,2,1
栈的应用
在各种程序设计语言中都有子程序(或称函数、过 程)调用功能。而子程序也可以调用其它的子程序,甚 至可以直接或间接地调用自身,即递归。
下面以求阶乘的递归方法为例,来分析计算机系
统是如何处理这种递归调用关系的。
求n!的递推公式:
输出 s=120.00
第一层调用
n=5 s=5*fact(4)
fact(5) =120
第二层调用
n=4 s=4*fact(3)
fact(4) =24
每一次递归调用并未立即得到
结果,而是进一步向深度递归
调用,直到n=1或n=0时,函数 fact才有结果为1,然后再一一 返回计算,最终得到结果。
第三层调用
3.1.3 栈的应用举例
例一、 数制转换 例二、 括号匹配的检验 例三、 表达式求值
例一、 数制转换
十进制数N和其他d进制数的转换算法基于以 下原理:
N = (N div d)×d + N mod d
例如: (1348)10 = (2504)8 ,其运算过程如下:
N N div 8 N mod 8
if (StackEmpty(S)&&state) return TRUE; else return FALSE; }
例三、 表达式求值(算符优先算法)
表达式求值是程序设计语言编译中的一 个最基本问题。它的实现方法是栈的一个典 型的应用实例。
算术四则运算的规则为: (1)先乘除、后加减; (2)同级运算时先左后右; (3)先括号内,后括号外。
} ADT Stack
栈的基本操作
InitStack(&S)
DestroyStack(&S)
StackLength(S)
StackEmpty(s)
GetTop(S, &e)
ClearStack(&S)
Push(&S, e)
Pop(&S, &e)
StackTravers(S, visit())
InitStack(&S)
相应的算法:
n!
n
1 (n 0,1) * (n 1)! (n 1)
float fact(int n)
{ if (n==0||n==1) s=1;
else s=n*fact(n-1);
return s; }
若求5!,递归调用执行过程:
主函数 mani() printf(“fact(5)”)
n=3 s=3*fact(2)
fact(3) =6
第四层调用
n=2 s=2*fact(1)
fact(2) =2
第五层调用
n=1 s=1
fact(1) =1
计算机系统处理上述过程时,其关键是要正确处理 执行过程中的递归调用层次和返回路径,也就是要记住 每一次递归调用时的返回地址。在系统中用一个线性表 动态记忆调用过程中的路径,其处理原则为:
线性表 Insert(L, i, x) 1≤i≤n+1 Delete(L, i, x)
1≤i≤n
栈 Insert(S, n+1, x)
Delete(S, n, x)
队列 Insert(Q, n+1, x)
Delete(Q, 1, x)
3.1 栈
栈(stack)是一种只允许在一端进行插入和删 除的线性表,它是一种操作受限的线性表。在表中只 允许进行插入和删除的一端称为栈顶(top),另一 端称为栈底(bottom)。栈的插入操作通常称为入栈或 进 栈 (push) , 而 栈 的 删 除 操 作 则 称 为 出 栈 或 退 栈 (pop)。当栈中无数据元素时,称为空栈。
假定表达式语法正确,且以“#”结束。
表达式求值的算符优先算法描述如下:
1.初始化操作数栈和运算符栈,置表达式起始符“#”为 运算符栈的栈底元素; 2.从左到右依次读出表达式中的各个元素(操作数或运 算符),每读出一个元素后,根据运算规则作如下的处 理: (1)如果是操作数,则将其压入操作数栈,并依次读下 一个元素。 (2)如果是运算符,则和运算符栈的栈顶运算符比较优 先权后作相应操作,直至整个表达式求值完毕(即运算 符栈的栈顶运算符和当前读入的元素均为“#”)。最后 的表达式的计算结果在操作数栈的栈顶位置。
54 5 4321
——该线性表就是栈
[栈]提要 3.1.1 栈的类型定义 3.1.2 栈类型的实现 3.1.3 栈的应用举例
3.1.1 栈的类型定义
ADT Stack { 数据对象: D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } 数据关系: R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n } 约定an 端为栈顶,a1 端为栈底。 基本操作: