第3章 栈和队列
数据结构-Java语言描述 第三章 栈和队列

System.exit(1);
}
栈顶指针top的初始值决
top=-1;
定了后续其他方法的实现
stackArray=(T[])new Object[n];
}
【算法3-2】入栈
public void push(T obj)
{
if(top==stackArray.length-1){
T []p=(T[])new Object [top*2];
(b)元素a2入栈
an … … a2 a1
(c)元素an入栈
an-1 … a2 a1
(d)元素an出栈
a2 a1
(e)元素a3出栈
a1
(f)元素a2出栈
【例3-1】一个栈的输入序列是1、2、3、4、5,若在 入栈的过程中允许出栈,则栈的输出序列4、3、5、1、 2可能实现吗?1、2、3、4、5的输出呢?
型 正序遍历:依次访问栈中每个元素并输出
3.1.2 顺序栈
顺序栈泛型类的定义如下:
public class sequenceStack<T> {
顺序栈中一维数组 的初始长度
final int MaxSize=10;
private T[] stackArray; 存储元素的数组对象
private int top;
public void nextOrder() {
for(int i=top;i>=0;i--) System.out.println(stackArray[i]);
}
【算法3-8】清空栈操作
public void clear() {
top=-1; }
3.1.3 链栈
栈的链接存储结构称为链栈。结点类的定义,同 第二章Node类。
数据结构(C语言)第3章 栈和队列

Data Structure
2013-8-6
Page 13
栈的顺序存储(顺序栈)
利用一组地址连续的存储单元依次存放自栈底到栈顶的数 据元素。 结构定义: #define STACK_INIT_SIZE 100; // 存储空间初始分配量 #define STACKINCREMENT 10; // 存储空间分配增量 typedef struct { SElemType *base; // 存储空间基址 SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素位单位 } SqStack;
解决方案2:
顺序栈单向延伸——使用一个数组来存储两个栈
Data Structure 2013-8-6 Page 21
两栈共享空间 两栈共享空间:使用一个数组来存储两个栈,让一个 栈的栈底为该数组的始端,另一个栈的栈底为该数组 的末端,两个栈从各自的端点向中间延伸。
Data Structure
2013-8-6
链栈需要加头结点吗? 链栈不需要附设头结点。
Data Structure
2013-8-6
Page 27
栈的链接存储结构及实现
Data Structure
2013-8-6
Page 11
GetTop(S, &e) 初始条件:栈 S 已存在且非空。 操作结果:用 e 返回S的栈顶元素。 Push(&S, e) 初始条件:栈 S 已存在。 操作结果:插入元素 e 为新的栈顶元素。 Pop(&S, &e) 初始条件:栈 S 已存在且非空。 操作结果:删除 S 的栈顶元素,并用 e 返回其值。
Data Structure
数据结构课件第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章 栈和队列

栈满 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
第三章 栈和队列

栈和队列的基本操作是线性表操作的子集,是限定性(操作受限制)的数据结构。
第三章栈和队列数据结构之栈和队列23. 1 栈¾定义:是限定仅在表尾进行插入或删除操作的线性表。
(后进先出线性表LIFO)¾栈底指针(base) :是线性表的基址;¾栈顶指针(top):指向线性表最后一个元素的后面。
¾当top=base 时,为空栈。
¾基本操作:InitStack(&S), DestroyStack(&S),StackEmpty(S) , ClearStack(&S),GetTop(S ,&e), StackLength(S) ,Push(&S, e): 完成在表尾插入一个元素e.Pop(&S,&e): 完成在表尾删除一个元素。
数据结构之栈和队列3¾栈的表示和实现¾顺序栈:是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素;栈满之后,可再追加栈空间即为动态栈。
¾顺序栈的结构类型定义:typedef int SElemType;typedef struct{SElemType *base; /* 栈底指针*/SElemType *top; /* 栈顶指针*/int stacksize; /* 栈空间大小*/ }SqStack;数据结构之栈和队列4¾基本算法描述¾建立能存放50个栈元素的空栈#define STACK_INIT_SIZE 50#define STACKINCREMENT 10Status InitStack_Sq(Stack &S){S.base=(SET*)malloc(STACK_INIT_SIZE *sizeof(SET)); /*为栈分配空间*/if(S.base==NULL)exit(OVERFLOW); /*存储分配失败*/ S.top=S.base;S.stacksize = STACK_INIT_SIZE;return OK; }数据结构之栈和队列5¾出栈操作算法void pop(Sqstack s,SElemType e){if(s.top= = s.base)return ERROR;else{s.top--;e= *s.top;}return OK;}出栈操作topABY topABYbase base数据结构之栈和队列6¾压栈操作算法void Push(SqStack s,SElemType e)if(s.top-s.base>= S.stacksize;) {S.base=(SET*)realloc(S,base,(S.stacksize+STACKINCREMEN T) *sizeof(SET)); /*为栈重新分配空间*/if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top=e;S.top++;}return OK; }topAB压栈操作topABebase base数据结构之栈和队列7¾栈的销毁void DestroyStack_Sq(Stack &S){ if (S.base) free(S.base);S.base=NULL;S.top=NULL;S.stacksize=0;}¾栈的清除void ClearStack_Sq(Stack &S){ S.top = S.base ;}数据结构之栈和队列8¾判断栈是否为空栈Status StackEmpty_Sq(Stack S){ if(S.top==S.base) return TRUE;else return FALSE;}¾获得栈的实际长度int StackLength_Sq(Stack S){return(abs(S.top-S.base));}数据结构之栈和队列9¾多个栈共享邻接空间两个栈共享一空间::::::top1top21m中间可用空间栈1栈2地址Base1Base 2……数据结构之栈和队列103. 3 栈与递归¾递归函数:一个直接调用自己或通过一系列的调用语句间接地调用自己的函数。
第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 )
《数据结构(C语言)》第3章 栈和队列

栈
❖ 栈的顺序存储与操作 ❖ 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
栈
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》第3章栈和队列共85题一、单选1. (1)分题目ID号:10705 题目难度:容易设对一组数据的处理具有“后进先出”的特点,则应采用的数据结构是【1】A. 队列B. 栈C. 顺序表D. 二叉树题目答案:B2. (1)分题目ID号:10706 题目难度:容易若进栈序列为3、5、7、9,进栈和出栈可穿插进行,则不可能的出栈序列是【1】A. 7,5,3,9B. 9,5,7,3C. 9,7,5,3D. 7,5,9,3题目答案:B3. (1)分题目ID号:10707 题目难度:较难设用一维数组A[m]存储栈,令A[m-1]为栈底,t指示当前栈顶的位置。
如果栈不空,则出栈时应使【1】A. t=t+lB. t=t-1C. t=m-1D. 不改变t题目答案:A4. (1)分题目ID号:10708 题目难度:容易设用一维数组A[m]存储栈,令A[0]为栈底,top指示当前钱顶的位置,当把栈清空时所要执行的操作是【1】A. top--B. top=0C. top=-1D. top=m-1 题目答案:C5. (1)分题目ID号:10709 题目难度:容易设栈s的初始状态为空,如果进栈序列为1、2、3、4、5、6,出栈序列为3、2、5、6、4、1,则s的容量至少是【1】A. 6B. 4C. 2D. 3题目答案:D6. (1)分题目ID号:10710 题目难度:容易设栈s最多能容纳4个元素,现有A、B、C、D、E、F六个元素按顺序进栈,以下可能的出栈序列是【1】A. E、D、C、B、A、FB. B、C、E、F、A、DC. C、B、E、D、A、FD. A、D、F、E、B、C题目答案:C7. (1)分题目ID号:10711 题目难度:容易链式栈与顺序栈相比,一个比较明显的优点是【1】A. 插入操作更加方便B. 通常不会出现栈满的情况C. 不会出现栈空的情况D. 删除操作更加方便题目答案:B8. (1)分题目ID号:10712 题目难度:容易在完成出栈操作时,【1】A. 必须判断栈是否满B. 要判断栈元素的类型C. 必须判断栈是否空D. 不必做任何判断题目答案:C9. (1)分题目ID号:10713 题目难度:容易已知栈的入栈序列是1、2、3、……、n,出栈序列是e1、e2、……、en。
若e1=n,则ei为【1】A. iB. n-i+1C. n-iD. 不能确定题目答案:B10. (1)分题目ID号:10714 题目难度:容易在解决计算机主机与打印机之间速度不匹配问题时,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,打印机则从该缓冲区取出数据打印,该缓冲区应该是一个【1】结构。
A. 栈B. 队列C. 线性表 D. 数组题目答案:B11. (1)分题目ID号:10715 题目难度:容易【1】不是队的基本运算。
A. 向队尾插入一个元素B. 读队头元素C. 删除队中第i个元素D. 判队是否为空题目答案:C12. (1)分题目ID号:10716 题目难度:容易当以顺序方式存储队列时,解决“假溢出”较为有效的方法是采用【1】A. 顺序队列B. 链式队列C. 顺序循环队列D. 三种都可以题目答案:C13. (1)分题目ID号:10717 题目难度:容易设一维数组Q[m]用于存放循环队列中的元素,同时用f指示当前队头元素的位置,r指示当前队尾元素的下一个位置。
假定队中元素个数总小于m,则计算队列中元素个数的公式为【1】A. (m+r-f)%m B. r-f C. m-(f-r) D. (m+(f-r))%m 题目答案:A题目分析:循环队列是解决假溢出的问题,通常把一维数组看成首尾相接。
在循环意义下的求元素个数的运算可以利用求模运算。
14. (1)分题目ID号:10718 题目难度:容易若用一个大小为10的一维数组存储顺序循环队列,且当前rear和front的值分别为4和8,当从队列中删除3个元素再加入2个元素后,rear和front的值分别是【1】A. 无法完成要求的操作B. 6和lC. 7和0 D. 6和11题目答案:B题目分析:循环队列是解决假溢出的问题,通常把一维数组看成首尾相接。
在循环意义下的加1运算通常用求模运算来实现。
所以入队和出队时的操作分别为:rear=(rear+1)%m,front=(front+1)%m。
15. (1)分题目ID号:10719 题目难度:容易栈和队列都是运算受限的线性表,它们的共同点是【1】A. 只允许在端点处插入和删除元素B. 元素都是后进先出C. 元素都是先进先出 D. 必须采用顺序存储结构题目答案:A题目分析:栈和队列都是运算受限的线性表,只允许在表端点处进行操作。
16. (1)分题目ID号:11091 题目难度:容易在一个链式队列中,假设front和rear分别为队头和队尾指针,则插入s所指结点的操作为【1】A. rear->next=s;rear=s;B. front ->next=s;front=s;C. s->next=front;front=s;D. s->next=r ear;rear=s;题目答案:A题目分析:队列是运算受限的线性表(FIFO),插入元素只能插在队尾,所以需修改队尾指针。
17. (1)分题目ID号:11096 题目难度:容易用链接方式存储的队列,在进行删除运算时【1】A. 仅修改头指针B. 头、尾指针可能都要修改C. 头、尾指针都要修改D. 仅修改尾指针题目答案:B题目分析:若队列中的元素多于一个,删除队列中的队尾元素,只需修改队尾指针;若队列中只有一个元素,删除该元素后,队头队尾指针都需要修改。
18. (1)分题目ID号:11097 题目难度:容易设计一个判别表达式中左,右括号是否配对出现的算法,采用【1】数据结构最佳。
A. 线性表的顺序存储结构B. 队列C. 线性表的链式存储结构D. 栈题目答案:D19. (1)分题目ID号:11099 题目难度:容易表达式a*(b+c)-d的后缀表达式是【1】A. abcd*+-B. abc+*d-C. abc*+d-D. -+*abcd题目答案:B20. (1)分题目ID号:11228 题目难度:容易已知队列(4,41,5,7,18.26,15),第一个进入队列的元素是4,则第五个出队列的元素是【1】A. 5B. 41C. 18D. 7题目答案:C21. (1)分题目ID号:11229 题目难度:容易对于顺序存储的循环队列,存储空间大小为N,头指针为F,尾指针为R,队列中元素的个数应为【1】A. R-FB. N+R-FC. (R—F十1)%N D. (N+R-F)%N题目答案:D22. (1)分题目ID号:11230 题目难度:容易一个队列的进队列顺序是1,2,3,4,则出队列顺序为【1】A. 4,3,2,1B. 2,4,3,1C. 1,2,3,4D. 3,2,1,4题目答案:C23. (1)分题目ID号:11231 题目难度:容易下列关于栈的叙述中正确的是【1】A. 在栈中只能插入数据B. 在栈中只能删除数据C. 栈是先进先出的线性表D. 栈是先进后出的线性表题目答案:D24. (1)分题目ID号:11232 题目难度:容易设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1,则栈S的容量至少应该是【1】A. 6B. 4C. 3D. 2题目答案:C题目分析:根据栈的性质(LIFO)得,e2出栈前,栈中存有e1和e2两个元素,e4出栈前,栈中存有e1、e3和e4三个元素,e4和e3出栈以后,e5和e6入栈,栈中同样存在e1、e5和e6三个元素,然后三个元素依次出栈,所以栈的容量至少应该为3。
25. (1)分题目ID号:11651 题目难度:容易若一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是【1】A. top=top+1; V[top]=xB. V[top ]=x; top=top+1C. top=top-1; V[top]=xD. V[top ]=x; top=top-1题目答案:C题目分析:栈式运算受限的线性表,只允许在栈顶进行插入和删除操作。
本题中栈顶指针为n+1,该数组将栈顶放在了下标大的一端,所以在进行入栈操作时top 指针应该进行减一操作。
通常元素进栈的操作为:先移动栈顶指针后存入元素。
26. (1)分题目ID号:11652 题目难度:容易一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i (1≤i≤n)个元素是【1】A. 不确定 B. n-i+1 C. iD. n-i题目答案:B题目分析:【解析】根据栈的性质(LIFO),若输出的第一个元素是n,则表明所有的元素已经入栈,则出栈顺序为n,n-1,…,3,2,1。
27. (1)分题目ID号:11653 题目难度:容易如果我们用数组A[1..100]来实现一个大小为100的栈,并且用变量top 来指示栈顶,top的初值为0,表示栈空。
请问在top为100时,再进行入栈操作,会产生【1】A. 正常动作B. 溢出C. 下溢 D. 同步题目答案:B题目分析:当top为100时,表示栈已经满了,此时再进行入栈操作,则会造成溢出。
28. (1)分题目ID号:11654 题目难度:容易栈在【1】中应用。
A. 递归调用B. 子程序调用 C. 表达式求值 D. A,B,C题目答案:D29. (1)分题目ID号:11655 题目难度:容易若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?【1】A. 1和 5B. 2和4 C. 4和2 D. 5和1题目答案:B题目分析:循环队列是解决假溢出的问题,通常把一维数组看成首尾相接。
在循环意义下的加1运算通常用求模运算来实现。
所以入队和出队时的操作分别为:rear=(rear+1)%m,front=(front+1)%m。
30. (1)分题目ID号:11656 题目难度:容易栈和队列的共同点是【1】A. 都是先进先出 B. 都是先进后出C. 只允许在端点处插入和删除元素D. 没有共同点题目答案:C题目分析:栈和队列都是运算受限的线性表,只允许在表端点处进行操作。
31. (1)分题目ID号:11657 题目难度:容易判定一个栈S(元素个数最多为MAXSIZE)为空和满的条件分别为【1】A. S->top!=-1 S->top!=MAXSIZE-1B. S->top=-1 S->top=MAXSIZE-1C. S->top=-1 S->top!=MAXSIZE-1D. S->top!=-1 S->top=MAXSIZE-1题目答案:B二、多选1. (1)分题目ID号:11227 题目难度:容易已知元素(8,25,14,87,51,90,6,19,20)。