第 3 章 特殊线性表---栈、队列和串

合集下载

数据结构(C++版)课后答案_(王红梅)第3章_特殊线性表

数据结构(C++版)课后答案_(王红梅)第3章_特殊线性表
⑺ 栈和队列的主要区别在于( )。 A 它们的逻辑结构不一样 B 它们的存储结构不一样 C 所包含的运算不一样 D 插入、删除运算的限定不一样 【解答】D
⑻ 设数组 S[n]作为两个栈 S1 和 S2 的存储空间,对任何一个栈只有当 S[n]全满时才不能进行进栈操作。为这两个栈 分配空间的最佳方案是( )。 A S1 的栈底位置为 0,S2 的栈底位置为 n-1 B S1 的栈底位置为 0,S2 的栈底位置为 n/2 C S1 的栈底位置为 0,S2 的栈底位置为 n D S1 的栈底位置为 0,S2 的栈底位置为 1 【解答】A ⑼ 设有两个串 p 和 q,求 q 在 p 中首次出现的位置的运算称作( )。 A 连接 B 模式匹配 C 求子串 D 求串长 【解答】B
⑷ 设计一个判别表达式中左右括号是否配对的算法,采用( )数据结构最佳 A 顺序表 B 栈 C 队列 D 链表 【解答】B
⑸ 在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印缓冲区,该缓冲区应该是一个( )结构。 A 栈 B 队列 C 数组 D 线性表 【解答】B
⑹ 一个队列的入队顺序是 1,2,3,4,则队列的输出顺序是( )。 A 4321 B 1234 C 1432 D 3241 【解答】B
5. 举例说明顺序队列的“假溢出”现象。 【解答】假设有一个顺序队列,如图 3-6 所示,队尾指针 rear=4,队头指针 front=1,如果再有元素入队,就会产生“上 溢”,此时的“上溢”又称为“假溢出”,因为队列并不是真的溢出了,存储队列的数组中还有 2 个存储单元空闲,其下标 分别为 0 和 1。
⑷ 对于采用顺序存储结构的串 S,编写一个函数删除其值等于 ch 的所有字符。 【解答】从后向前删除值为 ch 的所有元素,这样所有移动的元素中没有值为 ch 的元素,能减少移动元素的次数,提 高算法的效率。算法如下:

数据结构课件第3章

数据结构课件第3章

0
1
2
3
4
5
6
7
a1
a2
a3
a4
a5
a6
a7
队头 F=0
队尾 R=7
a3 2 1 3 0 4 7 a3 5 6 3 a2 2 1 a1 0 F=0 a4 4 a5 5 6 a6 7 a7 R=0 R=7 3 a2 2 1 a1 0
a4 4 a5 5 6 a6 7
a8
F=0
a7
R=0
F=0
删除所有元素
top X W … B top
top=0 空栈
top
W

B A
top=m-1 元素X出栈
top
A
A
top=m 满栈
top=1 元素A入栈
例:堆栈的插入、删除操作。 出栈操作程序如下: # define m 1000; /*最大栈空间*/ 出栈操作算法: 1)栈顶指针top是否为0: typedef struct stack_stru 若是,则返回;若不是, { int s[m]; int top; }; 则执行2。 void pop (stack, y) 2)将栈顶元素送给y, struct stack_stru stack; 栈顶指针减1。 int *y; { if (stack.top = = 0) printf (“The stack is empty ! \n”); top Y Y else { top B B *y=stack.s[stack.top]; A A stack.top - -; } 出栈操作 }
top=p;
} 栈的入栈、出栈操作的时间复杂度都为O(1)。
栈的应用
一、 表达式求值 表达式由操作数、运算符和界限符组成。 运算符可包括算术运算符、关系运算符、逻辑运算符。

大学数据结构课件--第3章 栈和队列

大学数据结构课件--第3章 栈和队列
top top 栈空 F E D C B A
栈满 top-base=stacksize
top
F
E
D C B
top top top top top top base
入栈PUSH(s,x):s[top++]=x; top 出栈 POP(s,x):x=s[--top]; top
base
4
A
3.1 栈
例1:一个栈的输入序列为1,2,3,若在入栈的过程中 允许出栈,则可能得到的出栈序列是什么? 答: 可以通过穷举所有可能性来求解:
3.2 栈的应用举例
二、表达式求值
“算符优先法”
一个表达式由操作数、运算符和界限符组成。 # 例如:3*(7-2*3) (1)要正确求值,首先了解算术四则运算的规则 a.从左算到右 b.先乘除后加减 c.先括号内,后括号外 所以,3*(7-2*3)=3*(7-6)=3*1=3
9
3.2 栈的应用举例
InitStack(S); while (!QueueEmpty(Q))
{DeQueue(Q,d);push(S,d);}
while (!StackEmpty(S)) {pop(S,d);EnQueue(Q,d);} }
第3章 栈和队列
教学要求:
1、掌握栈和队列的定义、特性,并能正确应用它们解决实 际问题;
用一组地址连续的存储单元依次存放从队头到队尾的元素, 设指针front和rear分别指示队头元素和队尾元素的位置。
Q.rear 5 4 Q.rear 3 2 3 2 5 4 Q.rear 3 3 5 4 5 4
F E D C
C B A
Q.front
2 1 0
C B
Q.front 2 1 0

数据结构练习题第三章栈、队列和数组习题及答案

数据结构练习题第三章栈、队列和数组习题及答案

第三章栈、队列和数组一、名词解释:1.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵二、填空题:1.栈修改的原则是_________或称________,因此,栈又称为________线性表。

在栈顶进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________或________。

2.栈的基本运算至少应包括________、________、________、________、________五种。

3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生“________”。

4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。

5.一般地,栈和线性表类似有两种实现方法,即________实现和________实现。

6.top=0表示________,此时作退栈运算,则产生“________”;top=sqstack_maxsize-1表示________,此时作进栈运算,则产生“________”。

7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以填充。

int InitStack(SqStackTp *sq){ ________;return(1);}8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填充。

Int Push(SqStackTp *sq,DataType x){ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}else{________________:________________=x;return(1);}}9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。

第3章栈和队列-数据结构与算法(第2版)-汪沁-清华大学出版社

第3章栈和队列-数据结构与算法(第2版)-汪沁-清华大学出版社

an
队头
队尾
队列示意图
入队
13
2、队列的基本运算
初始化队列 INIQUEUE(&Q)
将队列Q设置成一个空队列。
入队列
ENQUEUE(&Q,X)
将元素X插入到队尾中,也称“进队” ,“插入”。
出队列
DLQUEUE(&Q)
将队列Q的队头元素删除,也称“退队”、“删除”。
取队头元素 GETHEAD(Q)
也就是说,栈是一种后进先出(Last In First Out)的线性表,简称为LIFO表。
3
2、栈的运算
初始化栈:INISTACK(&S)
将栈S置为一个空栈(不含任何元素)。
进栈:PUSH(&S,X)
将元素X插入到栈S中,也称为 “入栈”、 “插入”、 “压 入”。
出栈: POP(&S)
删除栈S中的栈顶元素,也称为”退栈”、 “删除”、 “弹 出”。
9
三、链栈
typedef struct Lsnode { ElemType data;
struct Lsnode *next; } Lsnode *top;
一个链表栈由ቤተ መጻሕፍቲ ባይዱ顶指针top唯一确定。
10
1、链栈的主要运算
进栈操作 void Push(Lsnode *top; ElemType x)
{ p=(Lsnode *)malloc(sizeof(Lsnode)); p->data=x; p->next=top->next; top->next=p; }/*Push*/
第3章 栈和队列
1
栈和队列是二种特殊的线性表。是操作受 限的线 性表。 一、栈

第三章 栈

第三章 栈

S
∧ base
进栈算法
int lpush(Lstack s, int e)
{
S
e P
p=(Lstack)malloc(sizeof(lnode));
p->data=e; p->next=s; s=p; return (1); }
S
∧ base
2.3.1.3 栈的应用
(1) 过程的嵌套
主 程 序 r 子 程 序 1 s r 子 程 序 2
S
∧ base
进栈算法
int lpush(Lstack s, int e)
{
P p=(Lstack)malloc(sizeof(lnode));
p->data=e; S
p->next=s;
s=p; return (1); }
∧ base
进栈算法
int lpush(Lstack s, int e)
4 3 2
栈s
top a4 a3 a2 a1
else { - -top;
*py=s[top]; /*返回出栈元素*/
1
0
*ptop=top;
return(1);}}
(2)链栈
用指针来实现的栈叫链栈。栈的容量事先不能 估计时采用这种存储结构。 链栈的类型说明如下:
Typedef struct lnode
(c) 7,5,9,3 (d) 9,5,7,3
A[T]是栈顶元素
P76#15 用一维数组设计栈,初态是栈空, top=0。现有输入序列是 a、b、c、d,经过 push 、push、pop、push、pop、push操作后,输出 序列是( b、c ),栈顶指针是( 2 )

数据结构练习题 第三章 栈、队列和数组 习题及答案

数据结构练习题 第三章 栈、队列和数组 习题及答案

第三章栈、队列和数组一、名词解释:1.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵二、填空题:1.栈修改的原则是_________或称________,因此,栈又称为________线性表。

在栈顶进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________或________。

2.栈的基本运算至少应包括________、________、________、________、________五种。

3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生“________”。

4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。

5.一般地,栈和线性表类似有两种实现方法,即________实现和________实现。

6.top=0表示________,此时作退栈运算,则产生“________”;top=sqstack_maxsize-1表示________,此时作进栈运算,则产生“________”。

7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以填充。

int InitStack(SqStackTp *sq){ ________;return(1);}8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填充。

Int Push(SqStackTp *sq,DataType x){ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}else{________________:________________=x;return(1);}}9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。

第三章栈和队列

第三章栈和队列
西南交通大学信息科学与技术学院软件工程系‐赵宏宇
续8
//循环队列实现方案二 在SqQueue结构体中增设计数变量c,记录队列中当前 元素个数 void clearQueue(SqQueue &q) { q.r=q.f=-1; q.c=0; //r=f=-1~n-1区间任意整数均可 } int empty(SqQueue &q) { return q.c==0; } int full(SqQueue &q) { return q.c==q.n; } //队空、队满时q.f==q.r均为真 //优点:队满时没有空闲元素位置(充分利用了空间)
西南交通大学信息科学与技术学院软件工程系‐赵宏宇 数据结构A 第3章‐19
西南交通大学信息科学与技术学院软件工程系‐赵宏宇
数据结构A 第3章‐20
3.3 栈的应用
续1
3.3 栈的应用
续2
2. 栈与递归 (1) 递归程序的存储空间消耗 由于函数调用的指令返回地址、形式参数以及断 点状态均用系统堆栈实现存储,因此递归调用的层次 数(深度)决定了系统堆栈必须保留的存储空间容量大小。 例1 以下函数用递归法实现n元一维数组元素逆序存储, 试分析所需栈的深度。 void reverse(ElemTp a[], int i, int j) //数组a下标范围i..j实现元素逆序存储 { if(i<j) { a[i]a[j]; reverse(a, i+1, j-1); } }
西南交通大学信息科学与技术学院软件工程系‐赵宏宇 数据结构A 第3章‐7
3. 堆栈习题举例 例1 若元素入栈次序为ABC,写出所有可能的元素出栈 次序。 答: 所有可能的元素出栈次序共5种,即 ABC 操作PXPXPX (P表示入栈,X表示退栈) ACB PXPPXX BAC PPXXPX BCA PPXPXX CBA PPPXXX

大学《数据结构》第三章:栈和队列-第一节-栈

大学《数据结构》第三章:栈和队列-第一节-栈

第一节栈
一、栈的定义及其运算
1、栈的定义
栈(Stack):是限定在表的一端进行插入和删除运算的线性表,通常将插入、删除的一端称为栈项(top),另一端称为栈底(bottom)。

不含元素的空表称为空栈。

栈的修改是按后进先出的原则进行的,因此,栈又称为后进先出(Last In First Out)的线性表,简称为LIFO表。

真题选解
(例题·填空题)1、如图所示,设输入元素的顺序是(A,B,C,D),通过栈的变换,在输出端可得到各种排列。

若输出序列的第一个元素为D,则输出序列为。

隐藏答案
【答案】DCBA
【解析】根据堆栈"先进后出"的原则,若输出序列的第一个元素为D,则ABCD入栈,输出序列为DCBA
2、栈的基本运算
(1)置空栈InitStack(&S):构造一个空栈S。

数据结构第三章-栈和队列(严蔚敏)

数据结构第三章-栈和队列(严蔚敏)

}
s
top
top
…... 栈底 ^
x
24
出栈算法
LinkStack Pop_LinkStack (LinkStack DataType *x) { StackNode *p; if (top= =NULL)return NULL; else {*x = top->data; p = top; top = top->next; top top free (p); a return top;} p } x a top,
11
顺序栈
栈的顺序存储结构简称为顺序栈,是利用一组地址 连续的存储单元依次存放自栈底到栈顶的数据元素,同 时附设指针top指向实际栈顶后的空位置。
12
顺序表和顺序栈的操作区别
以线性表 S= (a1 , a2 , …. , an-1 , an )为例 顺序栈S an+1 高地址 顺序表S 高地址 表尾 an an …… …… S[i] ai ai …… …… a2 低地址 a1 a2 低地址 表头 a1 栈顶top 栈顶top
Stacksize 指示栈的当前可使用的最大容量。栈的初始化操作为: 按设定的初始分配量进行第一次存储分配; base可称为栈底指针,在顺序栈中它始终指向栈底的位置,若 base的值为NULL,则表明栈结构不存在。 top为栈顶指针,其初值指向栈底,即top=base可作为栈空的标 记; 每当插入新的栈顶元素时(入栈),堆栈指针top先压后加 (S[top++]=an+1); ; 删除栈顶元素时(出栈),堆栈指针top先减后弹
B
A
19
顺序栈入栈 int push(SqStack &s, SElemType e){ if (s.top-s.base>=s.stacksize){//栈满的判断 s.base=(SElemTYpe*) realloc(s.base,s.stacksize+ STACKINCREMENT)*sizeof(SElemType)); if (!s.base) exit (OVERFLOW); s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; top } *s.top++=e; //入栈( *s.top=e; *s.top++); return OK; } base

第3章 限定性线性表——栈和队列

第3章  限定性线性表——栈和队列

两栈共享技术(双端栈):
主要利用了栈“栈底位置不变,而栈顶位置动态变
化”的特性。首先为两个栈申请一个共享的一维数 组空间S[M],将两个栈的栈底分别放在一维数组的 两端,分别是0,M-1。
共享栈的空间示意为:top[0]和top[1]分别为两个 栈顶指示器 。
Stack:0
M-1
top[0]
top[1]
(1)第i号栈的进栈操作 int pushi(LinkStack top[M], int i, StackElementType x) { /*将元素x进入第i号链栈*/
LinkStackNode *temp; temp=(LinkStackNode * )malloc(sizeof(LinkStackNode)); if(temp==NULL) return(FALSE); /* 申请空间失败 */ temp->data=x; temp->next=top[i]->next; top[i]->next=temp; /* 修改当前栈顶指针 */ return(TRUE); }
case 1:if(S->top[1]==M) return(FALSE);
*x=S->Stack[S->top[1]];S->top[1]++;break;
default: return(FALSE);
}
return(TRUE);
返回主目录
}
【思考题】
说明读栈顶与退栈顶的处理异同,并标明将已知 的退栈顶算法改为读栈顶算法时应做哪些改动。
返回主目录
链栈的进栈操作
int Push(LinkStack top, StackElementType x)

数据结构实用教程(C语言版) 第3章 栈和队列

数据结构实用教程(C语言版)  第3章 栈和队列
返回到本节目录
3.1.1 栈的概念
假设有一个栈S=(a1,a2,…,an),栈 中元素按a1,a2,…,an的次序进栈后, 进栈的第一个元素a1为栈底元素,出栈的第 一个元素an为栈顶元素,也就是出栈的操作 是按后进先出的原则进行的,其结构如图31所示。
图3-1栈结构示意图
返回到本节目录
3.1.2栈的基本操作
3.1.3顺序栈
由于栈是操作受限制的线性表,因此与线性表类似,栈也 有两种存储结构,即顺序存储结构和链式存储结构。 1. 顺序栈的定义 栈的顺序存储结构称为顺序栈。类似于顺序表的类型定义,顺 序栈是用一个预设的足够长度的一维数组和一个记录栈顶元素 位置的变量来实现。顺序栈中栈顶指针与栈中数据元素的关1.3顺序栈
3. 顺序栈的基本操作实现
(3)进栈操作 进栈操作的过程如图3-3所示。先判断栈S如图3-3(a) 是否为满,若不满再将记录栈顶的下标变量top加1如 图3-3(b),最后将进栈元素放进栈顶位置上如图33(c)所示,算法描述见算法3.3。
图3-3 进栈操作过程图
返回到本节目录
栈除了在栈顶进行进栈与出栈外,还有初始化、判空 等操作,常用的基本操作有: (1)初始化栈InitStack(S)。其作用是构造一个空 栈 S。 (2)判断栈空EmptyStack(S)。其作用是判断是 否是空栈,若栈S为空,则返回1;否则返回0。 (3)进栈Push(S,x)。其作用是当栈不为满时,将 数据元素x插入栈S中,使其为栈S的栈顶元素。 (4)出栈Pop(S,x)。其作用是当栈S不为空时,将 栈顶元素赋给x,并从栈S中删除当前栈顶元素。 (5)取栈顶元素GetTop(S,x)。其作用是当栈S不 为空时,将栈顶元素赋给x并返回,操作结果只是 读取栈顶元素,栈S不发生变化。 返回到本节目录

第3章栈和队列

第3章栈和队列
第3章栈和队列

3.1.2 栈的表示和算法实现
1.顺序栈 2.链栈
第3章栈和队列
1. 顺序栈 顺序栈是用顺序存储结构实现的栈,即利 用一组地址连续的存储单元依次存放自栈 底到栈顶的数据元素,同时由于栈的操作 的特殊性,还必须附设一个位置指针top( 栈顶指针)来动态地指示栈顶元素在顺序 栈中的位置。通常以top=-1表示空栈。
第 3 章 栈和队列
3.1 栈 3.2 队列 3.3 栈和队列的应用
第3章栈和队列
3.1 栈
3.1.1 栈的抽象数据类型定义 3.1.2 栈的表示和算法实现
第3章栈和队列
3.1.1 栈的定义
1.栈的定义 栈(stack)是一种只允许在一端进行插入和删除的线 性表,它是一种操作受限的线性表。在表中只允许进
行插入和删除的一端称为栈顶(top),另一端称为 栈 底 (bottom) 。 栈 的 插 入 操 作 通 常 称 为 入 栈 或 进 栈 (push),而栈的删除操作则称为出栈或退栈(pop)。 当栈中无数据元素时,称为空栈。
栈是按照后进先出 (LIFO)的原则组 织数据的,因此, 栈也被称为“后进 先出”的线性表。
第3章栈和队列
(2)入栈操作
Status Push(SqStack &S, Elemtype e)
【算法3.2 栈的入栈操作】
{ /*将元素e插入到栈S中,作为S的新栈顶*/
if (S->top>= Stack_Size -1) return ERROR;
else { S->top++;
S->elem[S->top]=e;
return OK;}
Push(S,’you’)

第三章 字符串、队列和栈——队列和栈复习课件 浙教版(2019)高中信息技术选修1

第三章 字符串、队列和栈——队列和栈复习课件 浙教版(2019)高中信息技术选修1

elif s[i]== ")":
if top==-1:
_f_l_a_g_=_F_a_l_s_e__
break
else:
_t_o_p_=_t_o_p_-_1___
if top>=0: flag=False #栈中还有左括号
if flag: print("括号匹配”)
else: print("括号不匹配")
以交替进行,且7个元素的出栈顺序为b,d,c,f,e,a,g,则栈s的容量至少
C 应该为(

A.1
B.2
C.3
D.4
二、栈和队列的基本操作
存储 建队 入队 出队 存储 建栈 入栈 出栈
存储
★ 队列的存储结构:顺序结构存储(线性表结构),可以用数组来实现,也可用链表来实现。
〄 头指针head: 记录队首元素位置 〄 尾指针tail: 记录队尾元素的下一个位置 〄 初始时为空列表时,head和tail 均记录下标为0的位置
将一个十进制数转换为二进制数,根据入栈、出栈的步骤, 采用Python编写的完整程序及测试结果如下所示:
算法思想: 1)用栈结构存放每次获得的余数 2)根据栈特征输出每次获得的余数
st=[-1]*100
#列表中元素初始值为-1
top=-1
number=int(input(“请输入十进制整数:”))
出队
#出队1、2
while head!=tail: print(que[head]) head+=1
出栈
#出栈1、2:
while top>-1: print(stack[top]) top-=1
top!=-1

数据结构课后答案第3章

数据结构课后答案第3章

第 3 章特殊线性表——栈、队列和串2005-07-14第 3 章特殊线性表——栈、队列和串课后习题讲解1. 填空⑴设有一个空栈,栈顶指针为1000H,现有输入序列为1、2、3、4、5,经过push,push,pop,push,pop,push,push后,输出序列是(),栈顶指针为()。

【解答】23,1003H⑵栈通常采用的两种存储结构是();其判定栈空的条件分别是(),判定栈满的条件分别是()。

【解答】顺序存储结构和链接存储结构(或顺序栈和链栈),栈顶指针top= -1和top=NULL,栈顶指针top等于数组的长度和内存无可用空间⑶()可作为实现递归函数调用的一种数据结构。

【解答】栈【分析】递归函数的调用和返回正好符合后进先出性。

⑷表达式a*(b+c)-d的后缀表达式是()。

【解答】abc+*d-【分析】将中缀表达式变为后缀表达式有一个技巧:将操作数依次写下来,再将算符插在它的两个操作数的后面。

⑸栈和队列是两种特殊的线性表,栈的操作特性是(),队列的操作特性是(),栈和队列的主要区别在于()。

【解答】后进先出,先进先出,对插入和删除操作限定的位置不同⑹循环队列的引入是为了克服()。

【解答】假溢出⑺数组Q[n]用来表示一个循环队列,front为队头元素的前一个位置,rear为队尾元素的位置,计算队列中元素个数的公式为()。

【解答】(rear-front+n)% n【分析】也可以是(rear-front)% n,但rear-front的结果可能是负整数,而对一个负整数求模,其结果在不同的编译器环境下可能会有所不同。

⑻用循环链表表示的队列长度为n,若只设头指针,则出队和入队的时间复杂度分别是()和()。

【解答】O(1),O(n)【分析】在带头指针的循环链表中,出队即是删除开始结点,这只需修改相应指针;入队即是在终端结点的后面插入一个结点,这需要从头指针开始查找终端结点的地址。

⑼串是一种特殊的线性表,其特殊性体现在()。

特殊线性表——栈队列和串

特殊线性表——栈队列和串

第 3 章特殊线性表——栈、队列和串3.1 栈3.1.1 栈的逻辑结构1. 栈的定义栈是限定仅在表尾进行插入和删除操作的线性表。

允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。

2. 栈的抽象数据类型定义ADT StackData栈中元素具有相同类型及后进先出特性,相邻元素具有前驱和后继关系OperationInitStack输入:无功能:栈的初始化输出:无后置条件:构造一个空栈DestroyStack前置条件:栈已存在输入:无功能:销毁栈输出:无后置条件:释放栈所占用的存储空间Push前置条件:栈已存在输入:元素值x功能:在栈顶插入一个元素x输出:如果插入不成功,抛出异常后置条件:如果插入成功,栈顶增加了一个元素Pop前置条件:栈已存在输入:无功能:删除栈顶元素输出:如果删除成功,返回被删元素值,否则,抛出异常后置条件:如果删除成功,栈顶减少了一个元素GetTop前置条件:栈已存在输入:无功能:读取当前的栈顶元素输出:若栈不空,返回当前的栈顶元素值 后置条件:栈不变 Empty前置条件:栈已存在 输入:无功能:判断栈是否为空输出:如果栈为空,返回1,否则,返回0 后置条件:栈不变 endADT3.1.2 栈的顺序存储结构及实现1. 栈的顺序存储结构——顺序栈栈的顺序存储结构称为顺序栈。

1. 顺序栈的实现const int StackSize=10; //10只是示例性的数据,可以根据实际问题具体定义 template <class T> //定义模板类SeqStack class SeqStack {public:private: };3. 两栈共享空间提出问题:在一个程序中如果需要同时使用具有相同数据类型的两个栈时,如何处理呢? 解决方案一:为每个栈开辟一个数组空间;解决方案二:使用一个数组来存储两个栈,让一个栈的栈底为该数组的始端,另一个栈的栈底为该数组的末端,每个栈从各自的端点向中间延伸,如图3-3所示。

第三章 栈和队列_1

第三章  栈和队列_1
思考:假若表达式中含有三种括号?
9、Ackerman函数的定义如下, 请写出递归算法。
n+1
当 m=0 时
AKM(m, n)= AKM(m-1, 1)
当 m!=0, n=0时
AKM(m-1, AKM(m, n-1)) 当 m!=0, n!=0时
10、假设以带头结点的循环链表表示队列,并且 只设一个指针指向队尾元素站点(注意不设头 指针),试编写相应的队列初始化、判队空、 入队列和出队列的操作步骤(假设队尾的结点 指针为pr)。
11、假设以数组cycque[m]存放循环队列Q的元素, 同时设变量rear和quelen分别指示循环队列中 队尾元素位置和内含元素的个数。试给出此循 环队列的队满条件,并写出相应的队列初始化、 入队列和出队列的操作步骤。
12、某汽车轮渡口,过江渡船每次能载10辆车过 江。过江车辆分为客车类和货车类,上渡船有 如下规定:同类车先到先上船;客车先于货车 上渡船,且每上4辆客车,才允许上一辆货车; 若等待客车不足4辆,则以货车代替,若无货 车等待,允许客车都上船。试写一算法模拟渡 口管理。
列出算法执行到各步骤时栈中元素的动态变化 过程。
3.3 栈与递归的实现
1、求解n阶Hanoi塔问题的递归算法(p55 算法 3.5)
2、n=3或4时, n阶Hanoi塔问题的递归算法执行 过程中递归工作栈的动态变化过程(p57 图 3.7)
3.4 队列
一、抽象数据类型队列的定义
队列是一种先进先出的线性表(FIFO) 队头、队尾
循环队列
1、循环队列的顺序存储结构 # define MAXQSIZE 100 typedef struct { QElemType *base; int front; // 队列非空时指向队列头元素 int rear;

数据结构(朱战立)章 (3)

数据结构(朱战立)章 (3)
27
3.1.3堆栈的链式表示和实现 链式存储结构的堆栈称作链式堆栈。 1.链式堆栈的存储结构 我们已知,链式存储结构存储线性结构数据元素的方法
是用结点构造链。每个结点除数据域外还有一个或一个以上 的指针域。数据域用来存放数据元素,指针域用来构造数据 元素之间的关系。堆栈有两端,插入元素和删除元素的一端 为栈顶,另一端为栈底。
9
(4)出栈StackPop(S,d):把堆栈S的当前栈顶数据元素 删除并由参数d带回。若出栈成功返回1,失败返回0。
(5)取栈顶数据元素StackTop(S,d):取堆栈S的当前栈 顶数据元素并由参数d带回。若取到数据元素返回1,否则返 回0。
10
3.1.2堆栈的顺序表示和实现 顺序存储结构的堆栈称作顺序堆栈。 1.顺序堆栈的存储结构 根据前面的分析我们知道,顺序堆栈和顺序表的数据成
35
}4)出栈StackPop(LSNode*head, DataType*d)intStackPop(LSNode*head,DataType*d)
31
但若把链式堆栈设计成带头结点的结构,则插入和删除操作 改变的只是头指针所指头结点的指针域的值,而不是头指针 的值,因此头指针参数可设计成结点的指针类型;否则,若 把链式堆栈设计成不带头结点的结构,则插入和删除操作改 变的都是头指针的值,因此头指针参数必须设计成结点的双 重指针(即指针的指针)类型,否则头指针参数值的改变无法 带回主调函数中。关于这个问题的详细讨论可参见2.3.1节。
32
带头结点链式堆栈操作的实现如下: 1)初始化 StackInitiate(LSNode**head)voidStackInitiate(LSNode* *head) /*初始化带头结点链式堆栈*/ { if((*head=(LSNode*)malloc(sizeof(LSNode)))== NULL)exit(1); (*head)->next=NULL; }2)非空否 StackNotEmpty(LSNode*head)intStackNotEmpty(LSNode*he ad)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 填空⑴设有一个空栈,栈顶指针为1000H,现有输入序列为1、2、3、4、5,经过push,push,pop,push,pop,push,push 后,输出序列是(),栈顶指针为()。

【解答】23,1003H⑵栈通常采用的两种存储结构是();其判定栈空的条件分别是(),判定栈满的条件分别是()。

【解答】顺序存储结构和链接存储结构(或顺序栈和链栈),栈顶指针top= -1和top=NULL,栈顶指针top等于数组的长度和内存无可用空间⑶()可作为实现递归函数调用的一种数据结构。

【解答】栈【分析】递归函数的调用和返回正好符合后进先出性。

⑷表达式a*(b+c)-d的后缀表达式是()。

【解答】abc+*d-【分析】将中缀表达式变为后缀表达式有一个技巧:将操作数依次写下来,再将算符插在它的两个操作数的后面。

⑸栈和队列是两种特殊的线性表,栈的操作特性是(),队列的操作特性是(),栈和队列的主要区别在于()。

【解答】后进先出,先进先出,对插入和删除操作限定的位置不同⑹循环队列的引入是为了克服()。

【解答】假溢出⑺数组Q[n]用来表示一个循环队列,front为队头元素的前一个位置,rear为队尾元素的位置,计算队列中元素个数的公式为()。

【解答】(rear-front+n)% n【分析】也可以是(rear-front)% n,但rear-front的结果可能是负整数,而对一个负整数求模,其结果在不同的编译器环境下可能会有所不同。

⑻用循环链表表示的队列长度为n,若只设头指针,则出队和入队的时间复杂度分别是()和()。

【解答】O(1),O(n)【分析】在带头指针的循环链表中,出队即是删除开始结点,这只需修改相应指针;入队即是在终端结点的后面插入一个结点,这需要从头指针开始查找终端结点的地址。

⑼串是一种特殊的线性表,其特殊性体现在()。

【解答】数据元素的类型是一个字符⑽两个串相等的充分必要条件是()。

【解答】长度相同且对应位置的字符相等【分析】例如"abc"≠"abc ","abc"≠"bca"。

2. 选择题⑴若一个栈的输入序列是1,2,3,…,n,输出序列的第一个元素是n,则第i个输出元素是()。

A 不确定B n-iC n-i-1D n-i+1【解答】D【分析】此时,输出序列一定是输入序列的逆序。

⑵设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5、e6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出队的顺序是e2、e4、e3、e6、e5、e1,则栈S的容量至少应该是()。

A 6B 4C 3D 2【解答】C【分析】由于队列具有先进先出性,所以,此题中队列形同虚设,即出栈的顺序也是e2、e4、e3、e6、e5、e1。

⑶一个栈的入栈序列是1,2,3,4,5,则栈的不可能的输出序列是()。

A 54321B 45321C 43512D 12345【解答】C【分析】此题有一个技巧:在输出序列中任意元素后面不能出现比该元素小并且是升序(指的是元素的序号)的两个元素。

⑷设计一个判别表达式中左右括号是否配对的算法,采用()数据结构最佳A 顺序表B 栈C 队列D 链表【解答】B【分析】每个右括号与它前面的最后一个没有匹配的左括号配对,因此具有后进先出性。

⑸在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印缓冲区,该缓冲区应该是一个()结构。

A 栈B队列C 数组D线性表【解答】B【分析】先进入打印缓冲区的文件先被打印,因此具有先进先出性。

⑹一个队列的入队顺序是1,2,3,4,则队列的输出顺序是()。

A 4321B 1234C 1432D 3241【解答】B【分析】队列的入队顺序和出队顺序总是一致的。

⑺栈和队列的主要区别在于()。

A 它们的逻辑结构不一样B 它们的存储结构不一样C 所包含的运算不一样D 插入、删除运算的限定不一样【解答】D【分析】栈和队列的逻辑结构都是线性的,都有顺序存储和链接存储,有可能包含的运算不一样,但不是主要区别,任何数据结构在针对具体问题时包含的运算都可能不同。

⑻设数组S[n]作为两个栈S1和S2的存储空间,对任何一个栈只有当S[n]全满时才不能进行进栈操作。

为这两个栈分配空间的最佳方案是()。

A S1的栈底位置为0,S2的栈底位置为n-1B S1的栈底位置为0,S2的栈底位置为n/2C S1的栈底位置为0,S2的栈底位置为nD S1的栈底位置为0,S2的栈底位置为1【解答】A【分析】两栈共享空间首先两个栈是相向增长的,栈底应该分别指向两个栈中的第一个元素的位置,并注意C++中的数组下标是从0开始的。

⑼设有两个串p和q,求q在p中首次出现的位置的运算称作()。

A 连接B 模式匹配C 求子串D 求串长【解答】B3. 判断题⑴有n个元素依次进栈,则出栈序列有(n-1)/2种。

【解答】错。

应该有种。

⑵栈可以作为实现过程调用的一种数据结构。

【解答】对。

只要操作满足后进先出性,都可以采用栈作为辅助数据结构。

⑶在栈满的情况下不能做进栈操作,否则将产生“上溢”。

【解答】对。

⑷在循环队列中,front指向队头元素的前一个位置,rear指向队尾元素的位置,则队满的条件是front=rear。

【解答】错。

这是队空的判定条件,在循环队列中要将队空和队满的判定条件区别开。

⑸空串与空格串是相同的。

【解答】错。

空串的长度为零,而空格串的长度不为0,其长度是串中空格的个数。

4. 设有一个栈,元素进栈的次序为A,B,C,D,E,能否得到如下出栈序列,若能,请写出操作序列,若不能,请说明原因。

⑴C,E,A,B,D⑵C,B,A,D,E【解答】⑴不能,因为在C、E出栈的情况下,A一定在栈中,而且在B的下面,不可能先于B出栈。

⑵可以,设I为进栈操作,O为入栈操作,则其操作序列为IIIOOOIOIO。

5. 举例说明顺序队列的“假溢出”现象。

【解答】假设有一个顺序队列,如图3-6所示,队尾指针rear=4,队头指针front=1,如果再有元素入队,就会产生“上溢”,此时的“上溢”又称为“假溢出”,因为队列并不是真的溢出了,存储队列的数组中还有2个存储单元空闲,其下标分别为0和1。

6. 在操作序列push(1)、push(2)、pop、push(5)、push(7)、pop、push(6)之后,栈顶元素和栈底元素分别是什么?(push(k)表示整数k入栈,pop表示栈顶元素出栈。

)【解答】栈顶元素为6,栈底元素为1。

其执行过程如图3-7所示。

7.在操作序列EnQueue(1)、EnQueue(3)、DeQueue、EnQueue(5)、EnQueue(7)、DeQueue、EnQueue(9)之后,队头元素和队尾元素分别是什么?(EnQueue(k)表示整数k入队,DeQueue表示队头元素出队)。

【解答】队头元素为5,队尾元素为9。

其执行过程如图3-8所示。

8.空串和空格串有何区别?串中的空格符有何意义?空串在串处理中有何作用?【解答】不含任何字符的串称为空串,其长度为零。

仅含空格的串称为空格串,它的长度为串中空格符的个数。

串中的空格符可用来分隔一般的字符,便于人们识别和阅读,但计算串长时应包括这些空格符。

空串在串处理中可作为任意串的子串。

9. 算法设计⑴假设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。

试设计相应的入队和出队的算法。

【解答】出队操作是在循环链表的头部进行,相当于删除开始结点,而入队操作是在循环链表的尾部进行,相当于在终端结点之后插入一个结点。

由于循环链表不带头结点,需要处理空表的特殊情况。

入队算法如下:出队算法如下:⑵设顺序栈S中有2n个元素,从栈顶到栈底的元素依次为a2n,a2n-1,…,a1,要求通过一个循环队列重新排列栈中元素,使得从栈顶到栈底的元素依次为a2n,a2n-2,…,a2,a2n-1,a2n-3,…,a1,请设计算法实现该操作,要求空间复杂度和时间复杂度均为O(n)。

【解答】操作步骤为:①将所有元素出栈并入队;②依次将队列元素出队,如果是偶数结点,则再入队,如果是奇数结点,则入栈;③将奇数结点出栈并入队;④将偶数结点出队并入栈;⑤将所有元素出栈并入队;⑥将所有元素出队并入栈即为所求。

⑶用顺序存储结构存储串S,编写算法删除S中第i个字符开始的连续j个字符。

【解答】先判断串S中要删除的内容是否存在,若存在,则将第i+j-1之后的字符前移j个位置。

算法如下:⑷对于采用顺序存储结构的串S,编写一个函数删除其值等于ch的所有字符。

【解答】从后向前删除值为ch的所有元素,这样所有移动的元素中没有值为ch的元素,能减少移动元素的次数,提高算法的效率。

算法如下:⑸对串的模式匹配KMP算法设计求模式滑动位置的next函数。

【解答】参见3.2.5学习自测及答案1.在一个具有n个单元的顺序栈中,假定以地址低端(即下标为0的单元)作为栈底,以top作为栈顶指针,当出栈时,top 的变化为()。

A 不变B top=0;C top=top-1;D top=top+1;【解答】C2.一个栈的入栈序列是a, b, c, d, e,则栈的不可能的出栈序列是()。

A edcbaB cdebaC debcaD abcde【解答】C3.从栈顶指针为top的链栈中删除一个结点,用x保存被删除结点的值,则执行()。

A x=top; top=top->next;B x=top->data;C top=top->next; x=top->data;D x=top->data; top=top->next;【解答】D4.设元素1, 2, 3, P, A依次经过一个栈,进栈次序为123PA,在栈的输出序列中,有哪些序列可作为C++程序设计语言的变量名。

【解答】PA321, P3A21, P32A1, P321A, AP3215.设S="I_ am_ a_ teacther",其长度为()。

【解答】156.对于栈和队列,无论它们采用顺序存储结构还是链接存储结构,进行插入和删除操作的时间复杂度都是()。

【解答】O(1)7.如果进栈序列为A、B、C、D,则可能的出栈序列是什么?答:共14种,分别是:ABCD,ABDC,ACBD,ACDB,ADCB,BACD,BADC,BCAD,BCDA,BDCA,CBAD,CBDA,CDBA,DCBA8.简述队列和栈这两种数据结构的相同点和不同点。

【解答】相同点:它们都是插入和删除操作的位置受限制的线性表。

不同点:栈是限定仅在表尾进行插入和删除的线性表,是后进先出的线性表,而队列是限定在表的一端进行插入,在另一端进行删除的线性表,是先进先出的线性表。

相关文档
最新文档