第四章栈和队列

合集下载

数据结构-栈与队列

数据结构-栈与队列

栈 1.6栈的应用
运算符的优先级关系表在运算过程中非常重要,它是判定进栈、出栈的重要依据。
θ1
θ2
+
-
+
>
>
-
>
>
*
>
>
/
>
>
(
<
<
)
>
>
#
<
<
*
/
(
)
#
<
<
<
>
>
<
<
<
>
>
>
>
<
>
>
>
>
<
>
>
<
<
<
=
>
>
>
>
<
<
<
=

1.6栈的应用
下面以分析表达式 4+2*3-12/(7-5)为例来说明求解过程,从而总结出表达式求值的算 法。求解中设置两个栈:操作数栈和运算符栈。从左至右扫描表达式:# 4+2*3-12/(7-5) #, 最左边是开始符,最右边是结束符。表达式求值的过程如下表所示:
1.4栈的顺序存储结构
设计进栈算法——Push 函数。首先,判断栈是否已满,如果栈已满,就运用 realloc 函 数重新开辟更大的栈空间。如果 realloc 函数返回值为空,提示溢出,则更新栈的地址以及栈 的当前空间大小。最终,新元素入栈,栈顶标识 top 加 1。

栈和队列定义以及各基本操作的简要描述;

栈和队列定义以及各基本操作的简要描述;

栈和队列是计算机科学中常用的数据结构,它们分别具有特定的特点和用途。

下面我们将对栈和队列的定义以及它们各自的基本操作进行简要描述。

一、栈的定义及基本操作1. 栈的定义栈是一种具有后进先出(LIFO)特点的线性数据结构,它可以看作是只能在一端进行插入和删除操作的特殊线性表。

栈通常具有入栈(push)和出栈(pop)两种基本操作。

2. 入栈(push)操作入栈操作是将元素压入栈顶的过程,新元素将会成为栈顶元素,栈的大小加1。

3. 出栈(pop)操作出栈操作是将栈顶元素弹出的过程,栈的大小减1,同时返回栈顶元素的数值。

4. 其他基本操作除了入栈和出栈操作外,栈还常常具有获取栈顶元素(top)、判断栈空(empty)、获取栈大小(size)等基本操作。

二、队列的定义及基本操作1. 队列的定义队列是一种具有先进先出(FIFO)特点的线性数据结构,它可以看作是只能在一端进行插入操作,在另一端进行删除操作的特殊线性表。

队列通常具有入队列(enqueue)和出队列(dequeue)两种基本操作。

2. 入队列(enqueue)操作入队列操作是将元素添加到队列的末尾的过程,新元素将成为队列中的最后一个元素,队列的大小加1。

3. 出队列(dequeue)操作出队列操作是将队列中的第一个元素移除的过程,队列的大小减1,同时返回被移除的元素的数值。

4. 其他基本操作除了入队列和出队列操作外,队列还常常具有获取队列头元素(front)、判断队列空(empty)、获取队列大小(size)等基本操作。

总结:栈和队列分别具有特定的特点和操作,栈适合于后进先出的场景,例如递归函数调用、表达式求值等;队列适合于先进先出的场景,例如任务调度、缓冲队列等。

掌握栈和队列的定义及基本操作对于合理地设计和实现算法,提高程序运行效率具有重要意义。

由于栈和队列具有不同的特点和功能,它们在计算机科学中被广泛运用,常常用来解决各种实际问题。

接下来我们将扩展对栈和队列的运用场景、常见应用以及优缺点的讨论。

栈和队列-精选文档

栈和队列-精选文档
好运动者健,好思考者智,好助人 者乐好读书者博,好旅游者悦,好 4
(1)进栈操作
若栈不满,则在栈顶插入元素x作为新的栈顶。 void SqStack::Push(ElemType x) { if( top < stacksize-1) { top++; data[top]=x; } else cout<<”栈满”; }
好运动者健,好思考者智,好助人 者乐好读书者博,好旅游者悦,好 6
(3)取栈顶元素
若栈不空,则用result返回栈顶元素。 void SqStack::GetTop(ElemType &result ) { if(top > -1) { result= data[top]; } else cout<<"栈空"; }
栈与队列
西安交通大学计教中心
好运动者健,好思考者智,好助人 者乐好读书者博,好旅游者悦,好 1
栈的定义
栈是限制在表的一端进行 插入和删除操作的线性表。允 许进行插入和删除操作的一端 称为栈顶,另一端称为栈底。 如果多个元素依次进栈, 则后进栈的元素必然先出栈, 所以堆栈又称为后进先出 (LIFO)表。堆栈设有一个栈 顶指针标志栈顶位置。
好运动者健,好思考者智,好助人 者乐好读书者博,好旅游者悦,好 13
例如后缀式263+*的计算过程为2、6、3依 次入栈,读+号则令3和6依次出栈,计算 6+3后将结果9入栈,读*号则令9和2依次 出栈,计算2*9后将结果18入栈。这时18 就是最终结果。 【例2-3】假定表达式是由不超过四个实 数进行四则运算构成的算式,要编写一个 程序来求解该算式的结果。
top
进栈 出栈

《栈和队列梁》课件

《栈和队列梁》课件

对比分析
总结词
各有优缺点
详细描述
数组实现和链表实现各有优缺点。数组实现具有简单直观的优点,但在实际应用中可能会受到数组大 小限制的影响。链表实现更加灵活,但需要注意指针操作和内存管ห้องสมุดไป่ตู้问题。具体选择哪种实现方式需 要根据实际需求和应用场景来决定。
05
栈和队列的常见问题与解 决方案
栈溢出问题
栈溢出问题
当栈的大小不足以容纳新元素时 ,会发生栈溢出。这通常是由于 递归深度过深或栈空间分配不足
导致的。
解决方案
为栈分配足够的空间,避免过深的 递归,或者使用循环代替递归。
优化建议
使用动态内存分配函数(如malloc 和free)来动态调整栈的大小,以 适应不同的情况。
队列空指针问题
队列空指针问题
优化建议
栈的特性
先进后出(FILO)
栈中的元素必须遵循后进先出的原则,即最后一个进入栈的元素 将是第一个出去的元素。
插入和删除操作在栈顶进行
栈只允许在固定的一端(称为栈顶)进行插入和删除操作。
动态性
栈的大小可以根据需要进行动态调整。
栈的应用场景
后进先出(LIFO)的场景
01
如括号匹配、函数调用堆栈等,需要最后进入的元素最先出来
队列主要有入队、出队 、查看队首元素等操作

队列的应用场景
01
02
03
任务调度
在多任务系统中,可以使 用队列来实现任务的调度 和管理。
缓冲处理
在输入输出系统中,可以 使用队列来缓存数据,实 现数据的缓冲处理。
事件处理
在事件驱动的系统中,可 以使用队列来管理事件, 实现事件的顺序处理和并 发处理。

《栈和队列》课件

《栈和队列》课件

栈与队列的区别
数据存储方式
栈是后进先出(Last In First Out, LIFO)的数据结构,新元素总是被添加到栈顶,移除 元素时也是从栈顶开始。而队列是先进先出(First In First Out, FIFO)的数据结构,新 元素被添加到队列的尾部,移除元素时从队列的头部开始。
操作方式
栈的主要操作有push(添加元素)和pop(移除元素),而队列的主要操作有enqueue (添加元素)和dequeue(移除元素)。
《栈和队列》ppt课件
目录
CONTENTS
• 栈的定义与特性 • 队列的定义与特性 • 栈与队列的区别与联系 • 栈和队列的实现方式 • 栈和队列的算法实现 • 总结与思考
01 栈的定义与特性
CHAPTER
栈的定义
栈是一种特殊的线性 数据结构,遵循后进 先出(LIFO)原则。
栈中的元素按照后进 先出的顺序排列,最 新加入的元素总是位 于栈顶。
02
如何实现一个队列,并 实现其基本操作( enqueue、dequeue、 front)?
03
栈和队列在应用上有哪 些区别?请举例说明。
04
请设计一个算法,使用 栈实现括号匹配的功能 ,并给出测试用例。
谢谢
THANKS

队列的应用场景
任务调度
在任务调度中,可以将任 务按照优先级放入队列中 ,按照先进先出的原则进 行调度。
网络通信
在网络通信中,可以将数 据包放入队列中,按照先 进先出的原则进行发送和 接收。
事件处理
在事件处理中,可以将事 件放入队列中,按照先进 先出的原则进行处理。
03 栈与队列的区别与联系
CHAPTER
应用场景

数据结构叶核亚第五版第四章

数据结构叶核亚第五版第四章

数据结构叶核亚第五版第四章
第五版的《数据结构叶核亚》第四章主要讲解了栈和队列这两种线性数据结构,以下是章节内容的简要概述:
1. 栈的定义及其特点:栈是一种只允许在栈顶进行插入、删除操作的线性表,具有后进先出(LIFO)的特点。

栈顶指针始终指向栈顶元素,栈底为固定位置。

2. 栈的顺序存储结构:采用数组实现,需要定义一个栈顶指针和一个栈底指针,可以使用top变量表示栈顶指针,初始值为-1,每次插入或删除元素时更新top的值即可。

3. 栈的链式存储结构:采用链表实现,链表的头节点代表栈底,尾节点代表栈顶,每次插入或删除元素时只需要修改指针即可。

4. 栈的应用:主要包括表达式求值、函数调用等方面。

5. 队列的定义及其特点:队列是一种先进先出(FIFO)的线性表,只允许在一端插入,另一端删除,插入操作称作入队,删除操作称作出队。

6. 队列的顺序存储结构:采用数组实现,需要定义一个头指针和一个尾指针,可以使用front和rear变量来表示,初始值均为0。

7. 队列的链式存储结构:同样采用链表实现,需要定义一个头指针和一个尾指针,插入操作在链表尾部进行,删除操作在链表头部进行。

8. 循环队列:为了避免队列空间的浪费,可以采用循环队列的方式实现,即将队列当作一个环型结构来处理。

9. 双端队列:双端队列是一种两端都可以进行插入和删除操作的队列,支持队列和栈的所有操作。

以上就是《数据结构叶核亚》第四章的主要内容概述。

栈和队列知识点

栈和队列知识点

栈和队列知识点一、栈的知识点。

1. 定义。

- 栈是一种只能在一端进行插入和删除操作的线性表。

它按照后进先出(Last In First Out,LIFO)的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶。

例如,有一个栈用来存放盘子,只能从最上面(栈顶)取盘子或者放盘子,最先放进去的盘子在最下面(栈底),最后放进去的盘子在最上面。

2. 基本操作。

- 入栈(Push)- 操作:将元素插入到栈顶。

例如,在一个空栈中,入栈一个元素1,此时栈中只有一个元素1,它既是栈底元素也是栈顶元素;再入栈一个元素2,那么2就成为了栈顶元素,1在栈底。

- 出栈(Pop)- 操作:删除栈顶元素并返回该元素的值。

例如,对于刚才有元素1和2的栈,执行出栈操作后,将返回2,并且栈中只剩下元素1。

- 获取栈顶元素(Top或Peek)- 操作:返回栈顶元素的值,但不删除该元素。

例如,对于有元素1的栈,执行获取栈顶元素操作,将返回1,栈的状态不变。

3. 栈的存储结构。

- 顺序栈。

- 用数组来实现栈。

定义一个数组来存储栈中的元素,同时需要一个变量来指示栈顶元素的位置。

例如,在C语言中,可以定义一个数组`int stack[MAX_SIZE];`和一个变量`top`来表示栈顶位置。

初始时,`top = - 1`,表示栈为空。

当入栈一个元素时,先将`top`加1,然后将元素存入`stack[top]`中;出栈时,先取出`stack[top]`中的元素,然后将`top`减1。

- 链栈。

- 用链表来实现栈。

链栈的节点结构包含数据域和指向下一个节点的指针域。

链栈的栈顶就是链表的表头。

入栈操作就是在表头插入一个新节点,出栈操作就是删除表头节点。

例如,在C++中,可以定义一个结构体`struct StackNode {int data; StackNode *next;};`来表示链栈的节点,然后定义一个指向栈顶节点的指针`StackNode *top`。

栈和队列PPT课件

栈和队列PPT课件

p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return OK;
}
经营者提供商品或者服务有欺诈行为 的,应 当按照 消费者 的要求 增加赔 偿其受 到的损 失,增 加赔偿 的金额 为消费 者购买 商品的 价款或 接受服 务的费 用
typedef struct
{ Selemtype *base; //在栈构造之前和销毁之后,base的值为NULL
Selemtype *top; //栈顶指针
int
stacksize; //当前已分配的存储空间,以元素为单位
} sqstack;
栈的基本操作:P46
经营者提供商品或者服务有欺诈行为 的,应 当按照 消费者 的要求 增加赔 偿其受 到的损 失,增 加赔偿 的金额 为消费 者购买 商品的 价款或 接受服 务的费 用
x
x
y^ rear
y^ rear
经营者提供商品或者服务有欺诈行为 的,应 当按照 消费者 的要求 增加赔 偿其受 到的损 失,增 加赔偿 的金额 为消费 者购买 商品的 价款或 接受服 务的费 用
❖构造空队列
status InitQueue(LinkQueue &Q) {
Q.front=Q.rear=(QueuePtr)malloc(sizeof(Qnode));
若表达式未输入完,转1
例 计算 4+3*5
后缀表达式:435*+
top 3
top 4
4
top 5 3
7
top top

第四章栈与队列

第四章栈与队列

OPTR
# # #,* #,*,( #,*,( #,*,(,- #,*,(,- #,*,( #,* #
OPND
3 3 3 3,7 3,7 3,7,2 3,5 3,5 15
INPUT
3*(7-2)# *(7-2)# (7-2)# 7-2)# -2)# 2)# )# )# # #
OPERATE
Push(opnd,’3’) Push(optr,’*’) Push(optr,’(’) Push(opnd,’7’) Push(optr,’-’) Push(opnd,’2’) Operate(7-2)
}
建立空链栈:
struct stacknode *top=NULL; //初始化空栈,不带头结点
从空栈始,依次调用进栈算法建立含有若干个元素的 非空栈。
4.2 栈的应用举例
栈结构具有的后进先出特性,致使栈成为程序 设计中常用的工具。 一、栈的应用举例-----数制转换
十进制N和其它进制数的转换是计算机实现计 算的基本问题,其解决方法很多,其中一个简单算 法基于下列原理:
栈1底
栈1顶
栈2顶
图 两 个 栈 共 享 存 储 单 元 示 意 图
栈2底
三 链栈
栈的链式存储结构称为链栈,是插入和删 除操作仅限制在表头位置上进行的单链。由 于只能在链表头部进行操作,栈顶指针就是
链表的头指针。链栈的结点定义:
typedef struct stacknode
{ ElemType data; …… struct node *next;
现。特别注意栈空和栈满的条件; 3、熟练掌握队列的顺序表示、链表表示以及相应操作的实
现。特别是循环队列中队头与队尾指针的变化情况。

数据结构复习资料 第4章

数据结构复习资料 第4章

第4章栈和队列一、复习要点本章主要讨论3种线性结构:栈、队列与优先级队列。

这3种结构都是顺序存取的表,而且都是限制存取点的表。

栈限定只能在表的一端(栈顶)插入与删除,其特点是先进后出。

队列和优先级队列限定只能在表的一端(队尾)插入在另一端(队头)删除,不过优先级队列在插入和删除时需要根据数据对象的优先级做适当的调整,令优先级最高的对象调整到队头,其特点是优先级高的先出。

而队列不调整,其特点是先进先出。

这几种结构在开发各种软件时非常有用。

本章复习的要点:1、基本知识点要求理解栈的定义和特点,栈的抽象数据类型和在递归和表达式计算中的使用,在栈式铁路调车线上当进栈序列为1, 2, 3, , n时,可能的出栈序列计数,栈的顺序存储表示和链接存储表示,特别要注意,链式栈的栈顶应在链头,插入与删除都在链头进行。

另外,需要理解队列的定义和特点,队列的抽象数据类型和在分层处理中的使用,队列的顺序存储表示(循环队列)和链接存储表示,需要注意的是,链式队列的队头应在链头,队尾应在链尾。

还需要理解优先级队列的定义和特点。

优先级队列的最佳存储表示是堆(heap),本章介绍的表示看懂即可。

2、算法设计➢栈的5种操作(进栈、退栈、取栈顶元素、判栈空、置空栈)的在顺序存储表示下的实现,以及在链接存储表示下的实现。

➢使用栈的后缀表达式计算算法➢循环队列的进队列、出队列、取队头元素、判队列空、置空队列操作的实现➢链式队列的进队列、出队列、取队头元素、判队列空、置空队列操作的实现二、难点和重点1、栈:栈的特性、栈的基本运算➢栈的数组实现、栈的链表实现➢栈满及栈空条件、抽象数据类型中的先决条件与后置条件2、栈的应用:用后缀表示计算表达式,中缀表示改后缀表示3、队列:队列的特性、队列的基本运算➢队列的数组实现:循环队列中队头与队尾指针的表示,队满及队空条件➢队列的链表实现:链式队列中的队头与队尾指针的表示、三、习题的解析4-2 铁路进行列车调度时, 常把站台设计成栈式结构的站台,如右图所示。

第4章栈及队列

第4章栈及队列
}
4.1.5 栈的链式存储结构——链栈 1.链栈结构及数据类型
它是一种限制运算的链表,即规定链表中的扦入和删 除运算只能在链表开头进行。链栈结构见下图。
top 头
an
an-1
……
栈顶
图 3-5 链栈结构示意图
a1 ^
栈底
单链表的数据结构定义为: typedef struct node
{ elemtype data; //数据域 struct node *next; //指针域
3.出栈: POP(&S) 删除栈S中的栈顶元素,也称为”退栈”、 “删除”、 “弹出”。
4.取栈顶元素: GETTOP(S) 取栈S中栈顶元素。 5.判栈空: EMPTY(S) 判断栈S是否为空,若为空,返回值为1,否则返回值为0。
4.1.3 栈的抽象数据类型描述
ADT Stack {
Data: 含有n个元素a1,a2,a4,…,an,按LIFO规则存放,每个元素的类型都为 elemtype。 Operation: Void inistack(&s) //将栈S置为一个空栈(不含任何元素) Void Push(&s,x) //将元素X插入到栈S中,也称为 “入栈”、 “插 入”、 “压入”
{s->top[0]=-1; s->top[1]=m; }
(2)两个栈共享存储单元的进栈算法 int push(duseqstack *s, elemtype x, int i) //将元素x进入到以S为栈空间的第i个栈中 { if (s->top[0] ==s->top[1]-1) { printf(“overflow”); return (0);} if (i!=0 || i!=1) {printf(“栈参数出错“);return (0);} if(i= =0) //对0号栈进行操作 { s->top[0]++;s->stack[s->top[0]]=x;} else {s->top[1]--; s->stack[s->top[1]]=x;} return (1); }}

栈和队列

栈和队列

2014-7-15
13
前进一步:将下一通道块印上 “ 0 ” 作为当前立足点(切换当前立 足 点),并保存原立足点的信息以便回溯。 回溯一步:去掉当前立足点的足迹 “ 0 ”; 把最近的原立足点重新切换为当前立足点; 试探尚未试探过的方向。 上述的活动均需要在迷宫中移动,并且具有方向性,这种活动可 以使用二维数组下标增量技术来实现: 行下标增量 di[ k ] 列下标增量 dj[ k ] 方向及其序号 k 东0 南1 int di[4]={0,1,0,-1}; int dj[4]={1,0,-1,0};
2014-7-15
0 1
1 0
0 -1
-1 0
西2
北3
14
在上述的规定下: k=0 时,maze[i+di[k]][j+dj[k]] 为立足点的东面下一块; k=1 时,maze[i+di[k]][j+dj[k]] 为立足点的南面下一块; k=2 时,maze[i+di[k]][j+dj[k]] 为立足点的西面下一块; k=3 时,maze[i+di[k]][j+dj[k]] 为立足点的北面下一块; 客体的表示方法设计:从上述的用试探法走迷宫的过程可知,其中 所管理的信息是立足点的信息。可以用三元组 ( i , j , k ) 来表 示立足点,其中 ( i , j ) 表示立足点的位置信息,k 表示立足点 的下一个试探方向。可以将三元组定义成一个结构: struct items { int i,j,k; }; 数据的组织方法设计: 考察上述用试探法走迷宫的过程: 前进一步时,需要保存原立足点的信息; 回溯一步时,需要取出最近的原立足点的信息,并且遵循 后保存的先取出的原则,即“后进先出”的原则,因此可以用 栈 来记录立足点的信息。 迷宫问题的算法框架:

《栈和队列》课件

《栈和队列》课件

栈和队列的本质思想是
实现方式的重要性
通过限制插入和删除的
理解栈和队列的概念以
方式,实现了数据的有
及它们不同的实现方式
序存储和操作。
对于和队列在算法和
数据结构中的广泛 应用
栈和队列作为基本的数
据结构,在算法和数据
结构的设计中有着广泛
的应用。
1 Enqueue
插入元素到队列尾部。
2 Dequeue
从队列头部删除元素。
3 Front
获取队列头部元素的值,不改变队列的状 态。
4 isEmpty
判断队列是否为空。
队列的应用
约瑟夫问题
通过模拟元素出队/入队的 过程,解决经典的约瑟夫 问题。
循环队列
使用数组实现的循环队列, 可以有效地利用存储空间。
1 Push
将元素压入栈顶。
3 Peek
获取栈顶元素的值,不改变栈的状态。
2 Pop
将栈顶元素弹出。
4 isEmpty
判断栈是否为空。
栈的应用
中缀表达式转后缀表 达式
利用栈的特性将中缀表达 式转换为后缀表达式,方 便计算机进行计算。
括号匹配问题
利用栈判断一个表达式中 的括号是否匹配。
计算器程序
使用栈来实现简单的计算 器,可以进行基本的加减 乘除运算。
队列与广度优先搜索
在图的遍历过程中,广度 优先搜索需要使用队列来 保存未访问的节点。
栈和队列的比较
1 栈和队列的异同
栈和队列都是线性表,但栈是后进先出,队列是先进先出。
2 栈和队列的不同应用场景
栈在表达式求值和程序调用等领域有广泛应用,而队列在调度和模拟等领域有广泛应用。
总结
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
exit(1);
}
if(k==1){
BS.top1++;
Bs.stack[BS.top1]=item;
}
else if(k==2){
BS.top1--;
ElemType peek(BothStack& BS,int k)
{
if(k==1){
if(BS.top1==-1){
cerr<<"Stack 1 is empty!"<<end1;
exit(1);
当向栈2插入元素时,则使top2减1才能够得到新的栈顶位置。当top1等于top2-1或者top2等
于top1+1时,存储空间用完,无法再向任一栈插入元素。用于双栈操作的顺序存储类型可定
义为:
struct Bothstack{
ElemType stack[stackMaxSize];
int top1,top2;
};
双栈操作的抽象数据类型可定义为:
DAT BSTACK is
Data:采用顺序结构存储的双栈,其存储类型为Bothstack
operations:
void InitStack(Bothstack& BS,int k);
2.在一个数组空间stack[StackMaxSize]中可以同时存放两个顺序栈,栈底分别在数组的两端
,当第一个栈的栈顶指针top1等于-1时则栈1为空,当第二个栈的栈顶指针top2等于StackMax
Size时栈2为空。两个栈均向中间增长,当向栈1插入元素时,使top1增1得到新的栈顶位置,
BS.stack[BS.top2]=item;
}
}
ElemType pop(BothStack& BS,int k]
{
if(k==1){
if(BS.top==-1){
else if(k==3)
return(BS.top1==-1)&&(BS,top2==StackMaxSize);
else{
cerr<<"k的值不正确!"';
exit(1);
}
}
else if(k==2){
if(BS.top==StackMaxSize){
cerr<<"Stack 2 is empty!"<<end1;
exit(1);
}
BS.top2++;
//初始化栈。当k=1或2时对应置栈1或栈2为空,k=3时置两个格均为空
void Clearstack(BothStack& BS,int k)
//清除栈。当k=1或2时对应栈1或栈2被清除,k=3时两个栈均被清除
int StackEmpty(BothStack& BS,int k)
//判断栈是否为空。当k=1或2时判断对应的栈1或栈是否为空,k=3时
//判断两个栈是否同时为空。若判断结果为空则返回1,否则返回0
ElemType Peek(BothStack& BS,int k)
//取栈顶元素。当k=1或2时对应返回栈1或栈2的栈顶元素
void Push(BothStack& Bs,int k,const ElemType& item)
产生出100以内的20个正整数并输出,同时把它们中的偶数依次存入到第一个栈中,奇数
依次存入到第二个栈中,接着按照存入每个栈中元素的次序分别输出每个栈中的所有元素
(此操作不改变栈的状态),然后按照后进先出的原则输出每个栈中的所有元素。
解:
#include<iostream.h>
#include<stdlib.h>
三、普通题
1.假定有四个元素A、B、C、D,按所列次序进栈,试写出所有可能的出栈列,注意,每一
个元素进栈后都允许出栈,如ACDB就是一种出栈序列。
解:
ABCD ABDC ACBD ADCB BACD BADC BCAD
BCDA BDCA CBAD CDBA DCBA
else if(k==2)
BS.top2=StackMaxSize;
else if(k==3){
BS.top1=-1;
BS.top2=StackMaxSize;
}
}
void ClearStack(BothStack& BS,int k)
//进栈。当k=1或2时对应向栈1或栈2的顶端压入元素item
End BSTACK
1.试写出上述抽象数据类型中每一种操作的算法。
解:
void InitStack(BothStack& BS,int k)
{
if(k==1)
BS.top1=-1;
{ //函数体同上
}
int StackEmpty(BothStack& BS,int k){
if(k==1)
return BS.top1==-1;
else if(k==2)
return BS.top2==StackMaxSize;
A N-2 B N-1 C N D N+1
6.从一个顺序队列删除元素时,首先需要 B 。
A 前移一个队首指针 B 后移一位队首指针
C 取出队首指针所指位置上的元素 D 取出队尾指针所指位置上的元素
7.假定一个顺序队列的队首和队尾指针分别为f和r,则判断队空指针的条件为 D 。
}
void push(BothStack& BS,int k,const ElemType& item)
{
if(BS.top1==BS.top2-1){
cerr<<"Stack overflow!"<<end1;
插入的元素。
11.当用长度为N的数组顺序存储一个栈时,假定用top==N表示栈空,则表示栈满的条件为
top==0 。
12.向一个栈顶指针为HS的链栈中插入一个新结点*p时,应执行 p->next=HS; 和 HS=p; 操作。
13.从一个栈顶指针为HS的非空链栈中删除结点并不需要返回栈顶结点的值和回收结点时,
}
return BS,stack(bs,top1);
}
else if(k==2){
if(BS.top2==StackMaxSize){
cerr<<"Stack 2 is empty!"<<end1;
return BS.stack[BS,top2-1];
}
else{
cerr<<"k的值不正确!";
exit(1);
}
}
2.假定上述所有操作的算法已存于头文件"bstack.h"中,试编写一个程序,让计算机随机
A f+1==r B r+1==f C f==0 D f==r
8.假定一个链队的队首和队尾指针分别为fron和rear,则判断队空的条件为 D 。
A fron==rear B fron!=NULL C rear!=NULL D fron==NULL
二、填空题
3.若让元素1,2,3依次进栈,则出栈次序不可能出现 C 种情况。
A 3,2,1 B 2,1,3 C 3,1,2 D 1,3,2
4.在一个顺序队列中,队首指针指向队首元素的 A 位置。
A 前一个 B 后一个 C 当前 D 后面
5.当利用大小为N的数组顺序存储一个队列时,该队列的最大长度为 B 。
exit(1);
}
return BS,stack[BS,top2];
}
else{
cerr<<"k的值不正确!";
exit(1);
}
16.后缀表达式“45*32+-”的值为 15 。
17.在求解迷宫问题的递归算法中,输出每一个位置的坐标是按照从入口到出口的 相反
次顺 进行的。
18.在进行函数调用时,需要把每个实参的值和调用后的 返回地址 传送给被调用的函
数中。
19.当被调用的函数执行结束后,将自动按所保存的 返回地址 执行。
const int StackMaxSize=50;
1.队列的插入操作在 队首 进行,删除操作在 队尾 进。
2.栈又称为 后进先出 表,队列又称为 先进先出 表。
3.向一个顺序栈插入一个元素时,首先使 栈顶指针 后移一个位置,然后把待插入元素 写入 到这 Nhomakorabea位置上。
4.从一个栈删除元素时,首先取出 栈顶元素 ,然后再前移一位 栈顶指针 。
5.在一个顺序队列Q中,判断对空的条件为 Q.front==Q.next ,判断队满的条件为
(Q.rear+1)%QueueMaxSize+1==Q.front 。*
6.在一个顺序栈中,若栈顶指针等于 -1 ,则为空栈;若栈顶指针等于 StackMaxSize-1 ,
则为满栈。
7.在一个链栈中,若栈顶指针等于NULL则为 空栈 ;在一个链队中,若队首指针与队尾指针的
cerr<<"Stack 1 is empty!"<<end1;
exit(1);
}
相关文档
最新文档