栈与队列

合集下载

数据结构-栈与队列

数据结构-栈与队列

栈 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。

栈和队列

栈和队列
设计思路:用栈暂存左括号
应用3 :表达式求值
设计思路:用栈暂存运算符
应用4:汉诺仪(Hanoi)塔
设计思路:用栈实现递归调用
例 表达式求值
1)问题的提出 假若我们想在计算机上设计一个小计算器(程序), 其功能为:从键盘上输入一个算术表达式(由运算符操 作数构成的字符串),在屏目上显示输出表达式的求值结 果。 显然这个小计算器程序应该对你键入的表达式进行求 值。在该程序中如何对键入的表达式求值呢?又如,高 级语言中都有表达式,例赋值语句:变量=表达式;该 语句的执行过程为:先求出表达式的值, 然后将其值赋 给赋值号左边的变量。这个表达式的值是如何求出的?
我们看到:进行运算的算符i是当前扫描过的运算 符中优先级最高者,同时,也是到当前最后被保存的运 算符,由此可见,可以利用两个栈分别保存扫描过程中 遇到的操作数和运算符。
6 算法思想:
设定两栈:操作符栈 OPTR ,操作数栈 OPND 栈初始化:设操作数栈 OPND 为空;操作符栈 OPTR 的栈底 元素为表达式起始符 ‘#’; 依次读入字符:是操作数则入OPND栈,是操作符则要判断: if 操作符 < 栈顶元素,则退栈、计算,结果压入OPND栈; 操作符 = 栈顶元素且不为‘#’,脱括号(弹出左括号); 操作符 > 栈顶元素,压入OPTR栈。
问:堆栈是什么?它与一般线性表有什么不同?
答:堆栈是一种特殊的线性表,它只能在表的一端 (即栈顶)进行插入和删除运算。 与一般线性表的区别:仅在于运算规则不同。
一般线性表 逻辑结构:一对一 存储结构:顺序表、链表 运算规则:随机存取 堆栈 逻辑结构:一对一 存储结构:顺序栈、链栈 运算规则:后进先出(LIFO)
数据结构课程的内容
受限的线 性表

大学数据结构课件--第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

数据结构栈和队列ppt课件

数据结构栈和队列ppt课件

栈的运用 例3.1 将一个十进制正整数N转换成r进制的数
N 〕
1835
229
28
3
N / 8 〔整除〕 N % 8〔求余
229
3

28
5
3
4
0
3

❖例3.2 算术表达式中括号匹配的检查
❖用栈来实现括号匹配检查的原那么是,对表达式从左 到右扫描。
❖〔1〕当遇到左括号时,左括号入栈;
❖〔2〕当遇到右括号时,首先检查栈能否空,假设栈 空,那么阐明该“右括弧〞多余;否那么比较栈顶左 括号能否与当前右括号匹配,假设匹配,将栈顶左括 号出栈,继续操作;否那么,阐明不匹配,停顿操作 。
❖在顺序栈上实现五种根本运算的C函数 ❖〔3〕入栈 ❖int push (SeqStack *s, DataType x) ❖{ if (s->top==MAXSIZE-1) /*栈满不能入栈*/ ❖{ printf("overflow"); ❖return 0; ❖} ❖ s->top++; ❖ s->data[s->top]=x; ❖ return 1; ❖}
链队列及运算的实现
采用链接方法存储的队列称为链队列〔Linked Queue〕
采用带头结点的单链表来实现链队列,链队列中 的t结ype点de类f st型ruc与t N单od链e 表一样。将头指针front和尾指针 re{arD封at装aTy在pe一da个ta;构造体中,链队列用C言语描画如 下:struct Node *next;
❖只设了一个尾指针r ❖头结点的指针,即r->next ❖队头元素的指针为r->next->next ❖队空的断定条件是r->next==r

《数据结构(C语言)》第3章 栈和队列

《数据结构(C语言)》第3章 栈和队列
Data structures

❖ 栈的顺序存储与操作 ❖ 1.顺序栈的定义
(1) 栈的静态分配顺序存储结构描述 ② top为整数且指向栈顶元素 当top为整数且指向栈顶元素时,栈空、入栈、栈满 及出栈的情况如图3.2所示。初始化条件为 S.top=-1。
(a) 栈空S.top==-1 (b) 元素入栈S.stack[++S.top]=e (c) 栈满S.top>=StackSize-1 (d) 元素出栈e=S.stack[S.top--]
/*栈顶指针,可以指向栈顶
元素的下一个位置或者指向栈顶元素*/
int StackSize; /*当前分配的栈可使用的以 元素为单位的最大存储容量*/
}SqStack;
/*顺序栈*/
Data structures

❖ 栈的顺序存储与操作 ❖ 1.顺序栈的定义
(2) 栈的动态分配顺序存储结构描述 ① top为指针且指向栈顶元素的下一个位置 当top为指针且指向栈顶元素的下一个位置时,栈空 、入栈、栈满及出栈的情况如图3.3所示。初始化条 件为S.top=S.base。
…,n-1,n≥0} 数据关系:R={< ai-1,ai>| ai-1,ai∈D,i=1,2
,…,n-1 } 约定an-1端为栈顶,a0端为栈底 基本操作:
(1) 初始化操作:InitStack(&S) 需要条件:栈S没有被创建过 操作结果:构建一个空的栈S (2) 销毁栈:DestroyStack(&S) 需要条件:栈S已经被创建 操作结果:清空栈S的所有值,释放栈S占用的内存空间
return 1;
}
Data structures

信息学奥赛知识点(十二)—栈和队列

信息学奥赛知识点(十二)—栈和队列

栈和队列是信息学竞赛中经常涉及的数据结构,它们在算法和程序设计中有着广泛的应用。

掌握栈和队列的基本原理和操作方法,对于参加信息学竞赛的同学来说是非常重要的。

本文将深入探讨栈和队列的相关知识点,帮助大家更好地理解和掌握这两种数据结构。

一、栈的定义与特点栈是一种先进后出(LIFO)的数据结构,它的特点是只允许在栈顶进行插入和删除操作。

栈可以用数组或链表来实现,常见的操作包括压栈(push)、出栈(pop)、获取栈顶元素(top)等。

栈的应用非常广泛,比如在计算机程序中,函数的调用和返回值的存储就是通过栈来实现的。

二、栈的基本操作1. 压栈(push):将元素压入栈顶2. 出栈(pop):将栈顶元素弹出3. 获取栈顶元素(top):返回栈顶元素的值,但不把它从栈中移除4. 判空:判断栈是否为空5. 获取栈的大小:返回栈中元素的个数三、栈的应用1. 括号匹配:利用栈来检查表达式中的括号是否匹配2. 表达式求值:利用栈来实现中缀表达式转换为后缀表达式,并进行求值3. 迷宫求解:利用栈来实现迷宫的路径搜索4. 回溯算法:在深度优先搜索和递归算法中,通常会用到栈来保存状态信息四、队列的定义与特点队列是一种先进先出(FIFO)的数据结构,它的特点是只允许在队尾进行插入操作,在队首进行删除操作。

队列同样可以用数组或链表来实现,常见的操作包括入队(enqueue)、出队(dequeue)、获取队首元素(front)、获取队尾元素(rear)等。

队列在计算机领域也有着广泛的应用,比如线程池、消息队列等都可以用队列来实现。

五、队列的基本操作1. 入队(enqueue):将元素插入到队列的末尾2. 出队(dequeue):从队列的头部删除一个元素3. 获取队首元素(front):返回队列的头部元素的值4. 获取队尾元素(rear):返回队列的尾部元素的值5. 判空:判断队列是否为空6. 获取队列的大小:返回队列中元素的个数六、队列的应用1. 广度优先搜索算法(BFS):在图的搜索中,通常会用队列来实现BFS算法2. 线程池:利用队列来实现任务的调度3. 消息队列:在分布式系统中,常常会用队列来进行消息的传递4. 最近最少使用(LRU)缓存算法:利用队列实现LRU缓存淘汰在信息学竞赛中,栈和队列的相关题目经常出现,并且有一定的难度。

栈出队列公式

栈出队列公式栈和队列是数据结构中常见的两种线性结构。

栈是一种后进先出(Last In, First Out)的数据结构,而队列是一种先进先出(First In, First Out)的数据结构。

在实际应用中,我们有时需要将栈转化为队列,即栈出队列。

本文将介绍栈出队列的公式及其实现方法。

一、栈出队列的公式栈出队列的公式是指将栈转化为队列的操作。

假设我们有一个栈S和一个空队列Q,栈S中的元素依次为S1, S2, S3, ..., Sn。

要将栈S转化为队列Q,我们可以按照以下公式进行操作:1. 将栈S中的元素依次出栈,并将出栈的元素依次入队列Q中,直到栈S为空。

2. 此时队列Q中的元素顺序与栈S中的元素顺序相反。

3. 将队列Q中的元素依次出队列,并将出队列的元素依次入栈S中,直到队列Q为空。

4. 此时栈S中的元素顺序与原栈S中的元素顺序相同,即栈S已经转化为队列Q。

二、栈出队列的实现栈出队列的实现可以借助两个栈来完成。

我们称一个栈为栈A,另一个栈为栈B。

栈A用于入栈操作,栈B用于出栈操作。

1. 将栈S中的元素依次入栈A。

2. 当需要出队列时,先检查栈B是否为空,若为空,则将栈A中的元素依次出栈并入栈B。

3. 将栈B的栈顶元素出栈,即为队列的出队列元素。

4. 当栈A和栈B同时为空时,表示队列为空。

5. 如果需要继续进行入队列操作,可以将元素入栈A。

三、栈出队列的应用场景栈出队列的公式可以应用于许多实际场景中。

例如,我们需要实现一个优先级队列,栈出队列的公式可以帮助我们按照元素的优先级顺序进行操作。

具体实现时,我们可以给每个元素设置一个优先级,并将优先级高的元素先入栈,然后按照栈出队列的公式进行操作,即可实现优先级队列的功能。

另一个应用场景是在算法中,栈出队列的公式可以帮助我们实现栈的排序。

具体实现时,我们可以将需要排序的元素依次入栈A,然后按照栈出队列的公式进行操作,最后栈A中的元素就按照从小到大的顺序排列了。

第3章 栈和队列


例五、 表达式求值 例五、
限于二元运算符的表达式定义:
操作数) 运算符 运算符) 操作数 操作数) 表达式 ::= (操作数 + (运算符 + (操作数 操作数 操作数 ::= 简单变量 | 表达式 简单变量 :: = 标识符 | 无符号整数
表达式的三种标识方法: 表达式的三种标识方法: 设 Exp = S1 + OP + S2 则称 OP + S1 + S2 S1 + OP + S2 S1 + S2 + OP 为前缀表示法 前缀表示法 为中缀表示法 中缀表示法 为后缀表示法 后缀表示法
例如:(1348)10 = (2504)8 ,其 例如: 运算过程如下:
计 算 顺 序
N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 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
栈和队列是两种常用的数据类型
3.1 栈的类型定义 3.2 栈的应用举例 3.3 栈类型的实现 3.4 队列的类型定义 3.5 队列类型的实现
3.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 端为栈底。 基本操作: 基本操作: } ADT Stack

栈和队列的基本操作方法

栈和队列的基本操作方法栈和队列是常见的数据结构,它们在计算机科学中有着广泛的应用。

栈和队列都是一种线性数据结构,但它们在插入和删除元素的方式上有所不同。

接下来,将介绍栈和队列的基本操作方法,包括定义、插入、删除和查询等。

一、栈(Stack)的基本操作方法:1. 定义:栈是一种先进后出(Last-In-First-Out,LIFO)的数据结构。

类似于现实生活中的一叠盘子,只能在栈顶进行操作。

2.创建栈:可以使用数组或链表作为栈的底层数据结构。

通过创建一个空数组或链表,称之为栈顶指针或栈顶节点,初始时指向空,表示栈为空。

3. 入栈(Push):将一个元素添加到栈顶。

需要将新增元素放在栈顶指针或栈顶节点之后,更新栈顶指针或栈顶节点的指向。

4. 出栈(Pop):删除栈顶元素,并返回删除的元素值。

需要将栈顶指针或栈顶节点向下移动一个位置,指向下一个元素。

5. 获取栈顶元素(Top):返回栈顶元素的值,但不删除该元素。

只需访问栈顶指针或栈顶节点所指向的元素即可。

6. 判断栈是否为空(isEmpty):通过检查栈顶指针或栈顶节点是否为空来判断栈是否为空。

二、队列(Queue)的基本操作方法:1. 定义:队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。

类似于现实生活中的排队,按照先后顺序依次进入队列,先进入队列的元素首先被删除。

2.创建队列:可以使用数组或链表作为队列的底层数据结构。

通过创建一个空数组或链表,分别设置一个队首指针和一个队尾指针,初始时指向空,表示队列为空。

3. 入队(Enqueue):将一个元素添加到队尾。

需要将新增元素放在队尾指针或队尾节点之后,更新队尾指针或队尾节点的指向。

4. 出队(Dequeue):删除队首元素,并返回删除的元素值。

需要将队首指针或队首节点向下移动一个位置,指向下一个元素。

5. 获取队首元素(Front):返回队首元素的值,但不删除该元素。

栈与队列,各有异同。

栈与队列,各有异同。

⾸先是两者的定义:栈也称为堆栈,是⼀种线性表。

栈的特性:最先放⼊栈中的内容最后被拿出来,最后放⼊栈中的内容最先被拿出来,被称为先进后出、后进先出。

队列也是⼀种特殊的线性表。

不同于栈所服从的先进后出的原则,队列的原则是先进先出。

队列在队头做删除操作,在队尾做插⼊操作。

然后是两者的异同点不同点:1.删除数据元素的位置不同,栈的删除操作在表尾进⾏,队列的删除操作在表头进⾏。

2.队列先进先出,栈先进后出。

3.顺序栈能够实现多栈空间共享,⽽顺序队列不能。

4.遍历数据速度不同。

栈只能从头部取数据,也就最先放⼊的需要遍历整个栈最后才能取出来。

队列则不同,它基于地址指针进⾏遍历,⽽且可以从头或尾部开始遍历⽆需开辟临时空间,速度要快的多。

相同点:1.都是。

2.插⼊操作都是限定在表尾进⾏。

3.都可以通过顺序结构和链式结构实现。

4.插⼊与删除的时间复杂度与空间复杂度上两者均相同。

再然后便是两者的表⽰和操作的实现栈表⽰和操作的实现:#include <iostream>#define MAXSIZE 100//基础容量using namespace std;typedef struct{SElemType *top;//栈顶指针SElemType *base;//栈底指针int stacksize;//栈可⽤最⼤容量}SqStack;Status InitStack(SqStack &S)//初始化栈{S.base=new SElemType[MAXSIZE];if(!s.base) exit(OVERFLOW);//内存分配失败S.top=s.base;S.stacksize=MAXSIZE;}Status Push(SqStack &S,SElemType e)//把元素e压⼊栈顶{if(S.top-S.base==S.stacksize) return ERROR;//栈满*S.top++=e;//栈顶指针+1return OK;}Status Pop(SqStack &s,SElemType &e)//取出栈顶元素,并删除栈顶{if(S.top==S.base)//top与base重合时,栈为空return ERROR;e=*--S.top;return OK;}SElemType GetTop(SqStack S){if(S.top!=S.base)return *(S.top-1);}队列表⽰和操作的实现:#ifndef STATICQUEUE_H_INCLUDED#define STATICQUEUE_H_INCLUDEDtemplate<class T>class StaticQueue{public:StaticQueue();StaticQueue(int size);~StaticQueue();void enqueue(T data);T dequeue();bool isEmpty();bool isFull();int count();void display();private:int rear;int front;int size;const static int DEFAULT;T* queue;};这些在课本上都有,下⾯说说遇到的问题:对于作业3,可以说是屡战屡败,屡败屡战了,先是⼀点思路都没有,再到后来⽼师提⽰后有⼀点思路,但还是错误百出,再到后来参照书上的⽅法,还是错误,最后终于发现问题。

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

第4章栈和队列一、简答题1.栈是一种什么样的数据结构,它在插入、删除操作上与线性表的区别是什么?2.队列是一种什么的数据结构,在插入、删除操作上与线性表的区别是什么?3.设将整数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种排列中,哪些序列是可以通过相应的入出栈操作得到的。

4.链栈中为何不设置头结点?5.循环队列的优点是什么? 如何判别它的空和满?6.对于循环向量中的循环队列,写出求队列长度的公式。

7.设长度为n的链队用单循环链表表示,若设头指针,则入队出队操作的时间为何?若只设尾指针呢?二、选择题1.设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次入栈,如果6个元素出栈的顺序是s2,s3,s4,s6,s5,s1,则栈的容量至少应该是()。

A.2 B.3 C.5 D.62.若一个栈的输入序列是a、b、c,则通过入栈、出栈操作可能得到a、b、c的不同排列个数为()。

A.4 B.5 C.6 D.73.和顺序栈相比,链栈有一个比较明显的优势是()。

A.通常不会出现栈满的情况 B.通常不会出现栈空的情况C.插入操作更容易实现 D.删除操作更容易实现4.若一个栈的输入序列是 1,2,3,4…,n,输出序列的第一个元素是n,则第i个输出元素是()。

A.不确定 B.n-i C.n-i+1 D.n-i-15.以下说法正确的是()。

A.因链栈本身没有容量限制,故在用户内存空间的范围内不会出现栈满情况B.因顺序栈本身没有容量限制,故在用户存储空间的范围内不会出现栈满情况C.对于顺序栈而言,在栈满状态下,如果再进行入栈操作,则会发生“上溢”D.对于顺序栈而言,在栈满状态下,如果再进行出栈操作,则会发生“下溢”6.循环队列的入队操作应为()。

A.sq.rear=sq.rear+1;sq.data[sq.rear]=xB.sq.datap[sq.rear]=x;sq.rear=sq.rear+1;C.sq.rear=(sq.rear+1)% maxsiae;sq.data[sq.rear]=x;D.sq.data[sq.rear]=x;sq.rear=(sq.rear+1)% maxsize;7.循环队列的出队操作为()。

A.sq.front=(sq.front+1)% maxsize;B.sq.front=sq.front+1;C.sq.rear=(sq.rear+1)% maxsize;D.sq.rear=sq.rear+1;8.循环队列的队满条件为()。

A.(sq.rear+1)% maxsize= =(sq.front+1)% maxsize;B.(sq.rear+1)% maxsize= =sq.front+1;C.(sq.rear+1)% maxsize= =sq.front;D.sq.rear= =sq.front;9.循环队列的队空条件为()。

A.(sq.rear+1)% maxsize= =(sq.front+1)% maxsize;B.(sq.rear+1)% maxsize= =sq.front+1;C.(sq.rear+1)% maxsize= =sq.front;D.sq.rear= =sq.front;10.如果以链表作为栈的存储结构,则出栈操作时()。

A.必须判别栈是否满 B.判别栈元素的类别C.必须判别栈是否空 D.对栈不作任何判别11.向一个栈顶指针为top的链栈中插入一个s所指结点时,其操作步骤为()。

A.top->next=s; B.s->next=top->next;top->next=s;C.s->next=top;top=s; D.s->next=top;top=top->next;12.从栈顶指针为top的链栈中删除一个结点,并将被删结点的值保存到x中,其操作步骤为()。

A.x=top->data;top=top->next; B.top=top->next;x=top->data;C.x=top;top=top-<next; D.x=top->data;13.在一个链队中,若f、r分别为队头、队尾指针,则插入s所指结点的操作为( )。

A.f->next=s;f=s; B.r->next=s;r=s;C.s->next=r;r=s; D.s->next=f;f=s;14.一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是( )。

A. e,d,c,b,aB. d,e,c,b,aC. d,c,e,a,bD. a,b,c,d,e15.一个队列的入队序列是1,2,3,4,则队列的可能输出序列是( )。

A. 4,3,2,1B. 1,2,3,4C. 1,4,3,2D. 3,2,4,116.设计一个判别表达式中左、右括号是否配对出现的算法,采用( )数据结构最佳。

A.线性表的顺序存储结构B.栈C.队列D.线性表的链式存储结构17.栈是限定在()处进行插入或删除操作的线性表。

A.端点 B.栈底 C.栈顶 D.中间18.4个元素按A、B、C、D、顺序连续进栈,进行Pop(S,x)元素后,x的值是 ( ) 。

A. A B. B C. C D. D19.同一个栈内各元素的类型 ( )。

A.必须一致 B.可以不一致 C.不能一致 D.不必不一致20.已知一个算式的中缀表达式为a+(b-c)/d,则其后缀表达式是( )。

A. a+(b-c)/dB. abc-d/+C. bc-d/a+D. a+bc-d/21.从一个栈顶指针为high的链栈中删除一个结点时,假定用x保存删除结点的值,则执行()。

A.x=high; high=high->next; B. x=high->data;C. high=high->next; x=high->data;D. x=high->data; high=high->next;22.在具有n个单元顺序存储的循环队列中,队满时共有元素个数为()。

A.n+1 B. n-1 C. n D. n-223.在一个具有n个单元的顺序栈中,假设以地址高端作为栈底,以top作为栈顶指针,则作出栈处理时,top的变化为( )。

A.top不变 B. top=0 C. top=top-1 D. top=top+1三、判断题1.在顺序栈栈满情况下,不能再入栈,否则会产生“上溢”。

()2.与顺序栈相比,链栈的一个优点是插入和删除操作更加方便。

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

()4.在链队中,即使不设置尾指针也能进行入队操作。

()5.在对链队(带头结点)做出队操作时,不会改变front指针的值。

6.循环队列中元素个数rear-front。

()7.一个栈的输入序列是1,2,3,4,则在栈的输出序列中可以得到4,3,1,2。

()8.一个栈的输入序列是1,2,3,4,则在栈的输出序列中可以得到1,2,3,4。

()9.若以链表作为栈的存储结构,则出栈需要判断栈是否满。

()10.若以链表作为栈的存储结构,则出栈需要判断栈是否空。

()11.空栈是所有数据元素都为0的栈。

()四、填空1.向一个栈顶指针为TOP的链栈中插入一个s所指的结点时,其进行的操作是()。

2.从栈顶指针为TOP的链栈中删除一个结点,并将结点保存在x中,进行操作是()。

3.在具有n个单元的循环队列中,队满时具有()个元素.4.假设以S和X分别表示入栈和出栈操作,则对输入序列a,b,c,d,e进行一系列栈操作SSXSXSSXXX之后,得到的输出序列为()。

5.设有数组A[0..m]作为循环队列的存储队列的存储空间,front为队头指针,rear为队尾指针,则元素x执行入队操作的语句是()。

6.在一个链队中,如果f,r分别为队头、队尾指针,则插入s所指结点的操作是()。

7.栈的逻辑特点是(),队列的逻辑特点是(),二者的共同特点是()。

8.()可以作为实现递归函数调用的一种数据结构.9.在队列中,新插入的结点只能添加到()。

10.链队在一定范围内不会出现()的情况.当lq.front= =lq.rear时,队中无元素,此时()。

11.对带有头结点的链队lq,判定队列中只有一个数据元素的条件()。

12.设有一个空栈,现在输入序列为1,2,3,4,5,经过push,pop,push,pop,push后,栈顶指针所指元素是()。

13.循环队列sq队满条件为(),队空条件为()。

五、算法设计题1.回文是指正读反读均相同的字符序列,如"abba"和"abdba"均是回文,但"good"不是回文。

试写一个算法判定给定的字符向量是否为回文。

(提示:将一半字符入栈)2.利用栈的基本操作,写一个返回S中结点个数的算法int StackSize( SeqStack S),并说明S为何不作为指针参数或引用参数?3.一个双向栈S是在同一向量空间内实现的两个栈,它们的栈底分别设在向量空间的两端。

试为此双向栈设计初始化InitStack ( S ) 、入栈Push( S , i , x) 和出栈Pop( S ,i )等算法,其中i为0 或1,用以表示栈号。

4.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针) ,试编写相应的置空队、判队空、入队和出队等算法。

5.假设循环队列中只设rear和quelen 来分别指示队尾元素的位置和队中元素的个数,试给出判别此循环队列的队满条件,并写出相应的入队和出队算法,要求出队时需返回队头元素。

相关文档
最新文档