栈和队列答案教学内容

精品文档

精品文档 3.1 若按教科书3.1.1节中图3.1(b)所示铁道进行车厢调度(注意:两侧铁道均为单向行驶道),则请回答:

(1) 如果进站的车厢序列为123,则可能得到的出站车厢序列是什么?

(2) 如果进站的车厢序列为123456,则能否得到435612和135426的出站序列,并请说明为什么不能得到或者如何得到(即写出以 ‘S’表示进栈和以 ‘X’表示出栈的栈操作序列)。

解:(1) 123 231 321 213 132

(2) 可以得到135426的出站序列,但不能得到435612的出站序列。因为4356出站说明12已经在栈中,1不可能先于2出栈。

3.2 简述栈和线性表的差别。

解:线性表是具有相同特性的数据元素的一个有限序列。栈是限定仅在表尾进行插入或删除操作的线性表。

3.3 写出下列程序段的输出结果(栈的元素类型SElemType为char)。

void main()

{

Stack S;

char x,y;

InitStack(S);

x= ‘c’; y= ‘k’;

Push(S,x); Push(S, ‘a’); Push(S,y);

Pop(S,x); Push(S, ‘t’); Push(S,x);

Pop(S,x); Push(S, ‘s’);

while(!StackEmpty(S)) { Pop(S,y); printf(y); }

printf(x);

}

解:stack

3.4 简述以下算法的功能(栈的元素类型SElemType为int)。

(1) status algo1(Stack S)

{

int i,n,A[255];

n=0;

while(!StackEmpty(S)) { n++; Pop(S,A[n]); }

for(i=1;i<=n;i++) Push(S,A[i]);

}

(2) status algo2(Stack S,int e)

{

Stack T; int d;

InitStack(T);

while(!StackEmpty(S)){

Pop(S,d);

if(d!=e) Push(T,d);

}

while(!StackEmpty(T)){

Pop(T,d); 精品文档

精品文档 Push(S,d);

}

}

解:(1) 栈中的数据元素逆置 (2) 如果栈中存在元素e,将其从栈中清除

3.5 假设以S和X分别表示入栈和出栈的操作,则初态和终态均为空栈的入栈和出栈的操作序列可以表示为仅由S和X组成的序列。称可以操作的序列为合法序列(例如,SXSX为合法序列,SXXS为非法序列)。试给出区分给定序列为合法序列或非法序列的一般准则,并证明:两个不同的合法(栈操作)序列(对同一输入序列)不可能得到相同的输出元素(注意:在此指的是元素实体,而不是值)序列。

解:任何前n个序列中S的个数一定大于X的个数。

设两个合法序列为:

T1=S……X……S……

T2=S……X……X……

假定前n个操作都相同,从第n+1个操作开始,为序列不同的起始操作点。由于前n个操作相同,故此时两个栈(不妨为栈A、B)的存储情况完全相同,假设此时栈顶元素均为a。

第n+1个操作不同,不妨T1的第n+1个操作为S,T2的第n+1个操作为X。T1为入栈操作,假设将b压栈,则T1的输出顺序一定是先b后a;而T2将a退栈,则其输出顺序一定是先a后b。由于T1的输出为……ba……,而T2的输出顺序为……ab……,说明两个不同的合法栈操作序列的输出元素的序列一定不同。

3.6 试证明:若借助栈由输入序列12…n得到的输出序列为nppp21(它是输入序列的一个排列),则在输出序列中不可能出现这样的情形:存在着i

解:这个问题和3.1题比较相似。因为输入序列是从小到大排列的,所以若jp

3.7 按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,并仿照教科书3.2节例3-2的格式,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:

A-B×C/D+E↑F

解:BC=G G/D=H A-H=I E^F=J I+J=K

步骤 OPTR栈 OPND栈 输入字符 主要操作

1 # A-B*C/D+E^F# PUSH(OPND,A)

2 # A -B*C/D+E^F# PUSH(OPTR,-)

3 #- A B*C/D+E^F# PUSH(OPND,B)

4 #- A B *C/D+E^F# PUSH(OPTR,*)

5 #-* A B C/D+E^F# PUSH(OPND,C)

6 #-* A B C /D+E^F# Operate(B,*,C)

7 #- A G /D+E^F# PUSH(OPTR,/)

8 #-/ A G D+E^F# PUSH(OPND,D)

9 #-/ A G D +E^F# Operate(G,/,D) 精品文档

精品文档 10 #- A H +E^F# Operate(A,-,H)

11 # I +E^F# PUSH(OPTR,+)

12 #+ I E^F# PUSH(OPND,E)

13 #+ I E ^F# PUSH(OPTR,^)

14 #+^ I E F# PUSH(OPND,F)

15 #+^ I E F # Operate(E,^,F)

16 #+ I J # Operate(I,+,J)

17 # K # RETURN

3.8 试推导求解n阶梵塔问题至少要执行的move操作的次数。

解:12n

3.9 试将下列递推过程改写为递归过程。

void ditui(int n)

{

int i;

i = n;

while(i>1)

cout<

}

解:

void ditui(int j)

{

if(j>1){

cout<

ditui(j-1);

}

return;

}

3.10 试将下列递归过程改写为非递归过程。

void test(int &sum)

{

int x;

cin>>x;

if(x==0) sum=0;

else

{

test(sum);

sum+=x;

}

cout<

}

解:

void test(int &sum)

{ 精品文档

精品文档 Stack s;

InitStack(s);

int x;

do{

cin>>x;

Push(s,x);

}while(x>0);

while(!StackEmpty(s)){

Pop(s,x);

sum+=x;

cout<

}

DestoryStack(s);

}

3.11 简述队列和堆栈这两种数据类型的相同点和差异处。

解:栈是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。

队列也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。

3.12 写出以下程序段的输出结果(队列中的元素类型QElemType为char)。

void main()

{

Queue Q;

InitQueue(Q);

char x= ‘e’, y= ‘c’;

EnQueue(Q, ‘h’);

EnQueue(Q, ‘r’);

EnQueue(Q, y);

DeQueue(Q, x);

EnQueue(Q, x);

DeQueue(Q, x);

EnQueue(Q, ‘a’);

While(!QueueEmpty(Q))

{

DeQueue(Q,y);

cout<

}

cout<

}

解:char

3.13 简述以下算法的功能(栈和队列的元素类型均为int)。

void algo3(Queue &Q)

{

Stack S;

int d; 精品文档

精品文档 InitStack(S);

while(!QueueEmpty(Q))

{

DeQueue(Q, d);

Push(S, d);

}

while(!StackEmpty(S))

{

Pop(S, d);

EnQueue(Q, d);

}

}

解:队列逆置

3.14 若以1234作为双端队列的输入序列,试分别求出满足以下条件的输出序列:

(1) 能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列。

(2) 能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列。

(3) 既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列。

3.15 假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么有缺点。

解:

class DStack{

ElemType *top[2];

ElemType *p;

int stacksize;

int di;

public:

DStack(int m)

{

p=new ElemType[m];

if(!p) exit(OVERFLOW);

top[0]=p+m/2;

top[1]=top[0];

stacksize=m;

}

~DStack(){delete p;}

void Push(int i,ElemType x)

{

di=i;

if(di==0){

if(top[0]>=p) *top[0]--=x;

合集下载

3.数据结构作业答案第3章--第3章栈和队列自测卷答案作业答案

3.数据结构作业答案第3章--第3章栈和队列自测卷答案作业答案

L=head 头结点 R=head head 第3章 栈和队列 自测卷答案 姓名 班级

题号 一 二 三 四 五 六 总分

题分

15 10 20 20 20 15

100

得分

一、填空题(每空1分,共15分)

1. 【李春葆】向量、栈和队列都是 线性 结构,可以在向量的 任何

位置插入和删除元素;对于栈只能在 栈顶 插入和删除元素;对于队列只能在 队尾 插入和 队首 删除元素。

2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为 栈顶 。不允许插入和删除运算的一端称为 栈底 。

3. 队列 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。

4. 在一个循环队列中,队首指针指向队首元素的 前一个 位置。(注:不一定,这是一种约定,在殷教材中是队首指针指向队列的首元素位置)

5. 在具有n个单元的循环队列中,队满时共有 n-1 个元素。

6. 向栈中压入元素的操作是先 移动栈顶指针 ,后 存入元素 。

7. 从循环队列中删除一个元素时,其操作是 先 移动队首指针 ,后 取出元素 。(注:不一定,这是一种约定,在殷教材中是先 取出元素 ,后移动队首指针 )

8. 〖00年统考题〗带表头结点的空循环双向链表的长度等于 0 。

解:

二、判断正误(判断下列概念的正确性,并作出简要的说明。)(每小题1分,共10分)

( × )1. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。

错,线性表是逻辑结构概念,可以顺序存储或链式存储,与元素数据类型无关。

( × )2. 在表结构中最常用的是线性表,栈和队列不太常用。

错,不一定吧调用子程序或函数常用,CPU中也用队列。

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

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

1 第三章 栈、队列和数组

一、名词解释:

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{________________:

栈和队列教学实例在数据结构中的应用研究

栈和队列教学实例在数据结构中的应用研究

栈和队列教学实例在数据结构中的应用研究

栈和队列是数据结构中非常重要的两种基本数据结构,它们广泛应用于计算机科学的各个领域。在教学实例中,栈和队列的应用研究可以帮助学生更好地理解这两种数据结构的特点和用途。

首先,我们来看栈在数据结构中的应用。栈是一种后进先出(LIFO)的数据结构,可以通过压栈和出栈操作来实现数据的存储和访问。在教学实例中,可以通过模拟浏览器的前进和后退功能来介绍栈的应用。当用户在浏览器中点击“前进”或“后退”按钮时,实际上就是在操作一个栈,将浏览历史记录依次入栈或出栈,以实现页面的跳转。通过这个实例,学生可以直观地理解栈的操作和特点。

接着,我们来看队列在数据结构中的应用。队列是一种先进先出(FIFO)的数据结构,可以通过入队和出队操作来实现数据的存储和访问。在教学实例中,可以通过模拟排队等候的场景来介绍队列的应用。例如,当有多个任务需要处理时,可以将任务依次加入队列,然后按照队列的顺序一个一个地处理,确保任务的执行顺序和公平性。通过这个实例,学生可以理解队列的操作和应用场景。

除了上述实例,栈和队列在算法和数据处理中还有许多其他应用。比如,栈可以用于实现递归算法的函数调用栈,队列可以用于实现广度优先搜索算法中的节点遍历。在教学中,可以结合具体的算法实现或应用场景,让学生更深入地理解栈和队列的作用和价值。

总的来说,栈和队列在数据结构中的应用研究可以帮助学生加深对这两种基本数据结构的理解,培养他们的数据处理和算法设计能力。通过生动的教学实例,可以让学生在实践中体会栈和队列的实际应用,从而更好地掌握这两种数据结构的特点和用途。希望以上内容能够满足您的需求,如有其他问题,欢迎继续咨询。

栈和队列练习题答案

栈和队列练习题答案

栈和队列(答案)

1. 一个栈的入栈序列a,b,c,d,e,则栈的不可能的输出序列是__ C __。

A. edcba

B. decba

C. dceab

D. abcde

2. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为__ C __。

A. i

B. n=i

C. n-i+1

D. 不确定

3. 栈结构通常采用的两种存储结构是__ A __。

A. 顺序存储结构和链式存储结构

散列方式和索引方式

链表存储结构和数组

线性存储结构和非线性存储结构

4. 判定一个顺序栈ST(最多元素为m0)为空的条件是_ B ___。

A. top !=0

B. top= =0

C. top !=m0

D. top= =m0-1

5. 判定一个顺序栈ST(最多元素为m0)为栈满的条件是__ D __。

A. top!=0

B. top= =0

C. top!=m0

D. top= =m0-1

6. PUSH 和POP 命令常用于(C)操作。

A 队列

B 数组

C 栈

D 记录

7. 向一个栈顶指针为HS的链栈中插入一个s所指结点时,则执行__ C __。(不带空的头结点)

A. HS—>next=s;

B. s—>next= HS—>next; HS—>next=s;

C. s—>next= HS; HS=s;

D. s—>next= HS; HS= HS—>next;

8. 从一个栈顶指针为HS的链栈中删除一个结点时,用x 保存被删结点的值,则执行_ B _ __。(不带空的头结点)

A. x=HS; HS= HS—>next;

B. x=HS—>data;

C. HS= HS—>next; x=HS—>data;

D. x=HS—>data; HS= HS—>next;

第三章,栈和队列,练习题

第三章,栈和队列,练习题

精品文档

2016

1 / 21 第三章,栈和队列,练习题

一、 选择题

1、栈结构通常采用的两种存储结构是。

A、顺序存储结构和链表存储结构 B、散列和索引 C、链表存储结构和数组 D、线性链表和非线性存储

2、设栈ST用顺序存储结构表示,则栈ST为空的条件是

A、ST.top-ST.base0 B、ST.top-ST.base==0 C、ST.top-ST.basen D、ST.top-ST.base==n

3、向一个栈顶指针为HS的链栈中插入一个s结点时,则执行

A、HS->next=s; B、s->next=HS->next;HS->next=s; C、s->next=HS;HS=s; D、s->next=HS;HS=HS->next;

4、从一个栈顶指针为HS的链栈中删除一个结点,用x保存被删除结点的值,则执行

A、x=HS;HS=HS->next; B、HS=HS->next;x=HS->data;

C、

x=HS->data;HS=HS->next; D、s->next=Hs;Hs=HS->next;

7、一个队列的入列序列是1,2,3,4, 则队列的输出序列是//尾插入元素,头删除元素。

A、4,3,2,1 B、1,2,3,C、1,4,3,D、3,2,精品文档

2016

2 / 21 4,1

9、循环队列SQ采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front和rear,则判定此循环队列为满的条件是//不懂啊!!!

A、Q.front==Q.rear B、Q.front!=Q.rear C、Q.front==%n D、Q.front!=%n

朱战立数据结构第五版答案

朱战立数据结构第五版答案

未知驱动探索,专注成就专业

1

朱战立数据结构第五版答案

第一章:引论

1.1 数据结构的概念

数据结构是指数据对象中元素之间的关系和相互操作的一种集合体。数据结构的设计和实现对于解决实际问题非常重要。

1.2 抽象数据类型(ADT)

抽象数据类型是指一个数学模型以及该模型上的一组操作。通过使用抽象数据类型,我们可以将数据对象的表示和对数据对象的操作封装在一起,从而实现了数据的抽象。

1.3 算法的基本概念

算法是解题方案的准确而完整的描述,它是实现特定功能的有限指令序列。算法的设计和分析是数据结构和算法课程的核心内容。 未知驱动探索,专注成就专业

2

第二章:算法分析

2.1 算法效率的度量

算法的效率可以从时间复杂度和空间复杂度两个方面来度量。时间复杂度是指算法执行所需要的时间;空间复杂度是指算法执行所需要的额外空间。

2.2 最坏情况和平均情况

在算法分析中,我们通常关注算法在最坏情况下的表现,这是因为最坏情况下的性能是算法的上界,可以保证算法在任何情况下都能满足要求。

2.3 算法设计的要求

算法设计的要求包括正确性、可读性、健壮性和高效性。一个好的算法应当能够解决问题、易于理解、能够处理各种输入,并且在合理的时间内完成。 未知驱动探索,专注成就专业

3

第三章:线性表

3.1 线性表的定义

线性表是具有相同数据类型的n个数据元素的有限序列。线性表可以为空表,也可以包含一个或多个数据元素。

3.2 线性表的顺序表示

线性表的顺序表示是指使用一组地址连续的存储单元依次存储线性表的元素。顺序表示的优点是随机访问速度快,但插入和删除操作的效率较低。

3.3 线性表的链式表示

线性表的链式表示是指使用一组任意存储单元来存储线性表的元素,通过指针将这些存储单元链接在一起。链式表示的优点是插入和删除操作的效率较高,但访问元素的速度较慢。

3.4 线性表的应用

线性表是最常用的数据结构之一,它在实际问题中有广泛的应用。例如,线性表可以用来实现栈、队列、串等数据结构。 未知驱动探索,专注成就专业

栈和队列123

1 实验报告

2011-2012学年第 1 学期 任课老师:

课程名称 算法与数据结构 班级 软件工程 座号 X 姓名 XX

实验题目 实验三 栈和队列 实验时间 实验日期: 10—17

提交日期: 10—23

实验目的、要求

一、实验目的

1.熟悉栈和队列的存储结构;

2.熟悉栈和队列的数据结构特征;

3.熟悉栈和队列的应用。

实验设计内容

一、实验内容

1.假设称正读和反读都是相同的字符序列为“回文”。例如:„abba‟和„abcba‟是回文,‟abcde‟和平„ababab‟ 则不是回文。利用栈和队列实现:判别读入的一个以„@‟为结束符的字符序列是否是”回文”。

2.利用栈的基本操作实现将任意一个十进制整数转化为R进制整数

算法为: 1、定义栈的顺序存取结构

2、分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等)

3、定义一个函数用来实现上面问题 :

二、实验步骤

题目一:

1.数据结构描述:

先建立一个栈和一个队列,输入一列字符,并将此字符存入栈和队列中,由于栈是先进后出,而队列是先进先出,将栈和队列输出的字符相比较,如若相同,则为回文,否则,则不为回文。

2.算法的实现

根据实验内容的描述设计算法:

int huiwen() { elemtype a,b,c; int i=0,n=0,t=1; SeqStack *S; SeqQueue *Q; S=InitStack(S); Q=InitQueue(Q); printf("Please input the item:"); scanf("%c",&c); while(c!='@') { EnQueue(Q,c); Push(S,c); scanf("%c",&c); n++; }

第3课 栈、队列和数组

第三课 栈、队列和数组

一 选择题

1.对于栈操作数据的原则是( )。

A.先进先出 B.后进先出 C.后进后出 D.不分顺序

2.一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是( )。

A.不确定 B.n-i+1 C.i D.n-i

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

A.i-j-1 B.i-j C.j-i+1 D.不确定的

4.设abcdef以所给的次序进栈,若在进栈操作时,允许出栈操作,则下面得不到的出栈序列为( )。

A.fedcba B.bcafed C.dcefba D.cabdef

5.输入序列为ABC,可以变为CBA时,经过的栈操作为( )

A.push,pop,push,pop,push,pop B.push,push,push,pop,pop,pop

C.push,push,pop,pop,push,pop D.push,pop,push,push,pop,pop

6.若一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是( )。

A.top=top+1; V[top]=x B.V[top]=x; top=top+1

C.top=top-1; V[top]=x D.V[top]=x; top=top-1

7.若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈(i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( )。

A.|top[2]-top[1]|==0 B.top[1]+1==top[2] C.top[1]+top[2]==m D.top[1]==top[2]

计算机学科专业基础综合数据结构-栈、队列和数组(一)

计算机学科专业基础综合数据结构-栈、队列和数组(一)

(总分:92.00,做题时间:90分钟)

一、单项选择题(总题数:26,分数:52.00)

1.一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是 ____ 。

(分数:2.00)

A.不确定

B.n-i+1 √

C..i

D.n-i

解析:按照堆栈“后进先出”的特点,n是最后一个入栈的,即n为栈顶元素。若输出的第一个元素为n,则其余所有元素必定仍在堆栈中。第一个输出元素为n,则第二个输出元素为n-1,第i个输出元素为n-i+1,最后一个(第n个)输出元素为1。

2.有六个元素6,5,4,3,2,1的顺序进栈,下列 ____ 不是合法的出栈序列。

(分数:2.00)

A.5 4 3 6 1 2

B.4 5 3 1 2 6

C.3 4 6 5 2 1 √

D.2 3 4 1 5 6

解析:考查堆栈“后进先出”的特点。对选项A来说,第一个出栈元素是5,因为6先于5进栈,所以必定在5之后出栈,其余的元素出栈顺序任意;对选项B来说,第一个出栈元素是4,所以5和6两个元素必定在4之后依次出栈;对选项C来说,第一个出栈元素是3,则必有4、5、6三个元素依次在3后面出栈,但是选项C中的顺序是3、4、6、5,这是不符合要求的;对选项D来说,第一个出栈元素是2,则必有3、4、5、6依次在2后面出栈,D也是符合要求的,因此答案选C。

总结:这种问题如何解决呢?我们看第一个出栈元素,然后确定先于第一个元素进栈的所有其他元素,这些元素一定在第一个出栈元素之后顺序出栈。如果第一个元素仍然无法判断出来,可继续看后面的元素,依次类推。举例如下:

假设第一个出栈的元素是1,则出栈顺序一定是6、5、4、3、2、1,没有其他情况。

假设第一个出栈的元素是2,则出栈顺序可能有:

213456;231456;234156; 234516‘; 234561

栈和队列习题答案

第三章 栈和队列习题答案

一、基础知识题

设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题:

(1)若入、出栈次序为Push(1), Pop(),Push(2),Push(3), Pop(), Pop( ),Push(4), Pop( ),则出栈的数字序列为何(这里Push(i)表示i进栈,Pop( )表示出栈)

(2)能否得到出栈序列1423和1432并说明为什么不能得到或者如何得到。

(3)请分析 1,2 ,3 ,4 的24种排列中,哪些序列是可以通过相应的入出栈操作得到的。

答:(1)出栈序列为:1324

(2)不能得到1423序列。因为要得到14的出栈序列,则应做Push(1),Pop(),Push(2),Push

(3),Push(4),Pop()。这样,3在栈顶,2在栈底,所以不能得到23的出栈序列。能得到1432的出栈序列。具体操作为:Push(1), Pop(),Push(2),Push(3),Push(4),Pop(),Pop(),Pop()。

(3)在1,2 ,3 ,4 的24种排列中,可通过相应入出栈操作得到的序列是:

1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3214,3241,3421,4321

不能得到的序列是:

1423,2413,3124,3142,3412,4123,4132,4213,4231,4312

链栈中为何不设置头结点

答:链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。

循环队列的优点是什么 如何判别它的空和满

答:循环队列的优点是:它可以克服顺序队列的"假上溢"现象,能够使存储队列的向量空间得到充分的利用。判别循环队列的"空"或"满"不能以头尾指针是否相等来确定,一般是通过以下几种方法:一是另设一布尔变量来区别队列的空和满。二是少用一个元素的空间,每次入队前测试入队后头尾指针是否会重合,如果会重合就认为队列已满。三是设置一计数器记录队列中元素总数,不仅可判别空或满,还可以得到队列中元素的个数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档