栈和队列
数据结构-栈与队列

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

栈满 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课件

栈的运用 例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
信息学奥赛知识点(十二)—栈和队列

栈和队列是信息学竞赛中经常涉及的数据结构,它们在算法和程序设计中有着广泛的应用。
掌握栈和队列的基本原理和操作方法,对于参加信息学竞赛的同学来说是非常重要的。
本文将深入探讨栈和队列的相关知识点,帮助大家更好地理解和掌握这两种数据结构。
一、栈的定义与特点栈是一种先进后出(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缓存淘汰在信息学竞赛中,栈和队列的相关题目经常出现,并且有一定的难度。
栈与队列实验报告总结

栈与队列实验报告总结实验报告总结:栈与队列一、实验目的本次实验旨在深入理解栈(Stack)和队列(Queue)这两种基本的数据结构,并掌握其基本操作。
通过实验,我们希望提高自身的编程能力和对数据结构的认识。
二、实验内容1.栈的实现:我们首先使用Python语言实现了一个简单的栈。
栈是一种后进先出(LIFO)的数据结构,支持元素的插入和删除操作。
在本次实验中,我们实现了两个基本的栈操作:push(插入元素)和pop(删除元素)。
2.队列的实现:然后,我们实现了一个简单的队列。
队列是一种先进先出(FIFO)的数据结构,支持元素的插入和删除操作。
在本次实验中,我们实现了两个基本的队列操作:enqueue(在队尾插入元素)和dequeue(从队头删除元素)。
3.栈与队列的应用:最后,我们使用所实现的栈和队列来解决一些实际问题。
例如,我们使用栈来实现一个算术表达式的求值,使用队列来实现一个简单的文本行编辑器。
三、实验过程与问题解决在实现栈和队列的过程中,我们遇到了一些问题。
例如,在实现栈的过程中,我们遇到了一个“空栈”的错误。
经过仔细检查,我们发现是因为在创建栈的过程中没有正确初始化栈的元素列表。
通过添加一个简单的初始化函数,我们解决了这个问题。
在实现队列的过程中,我们遇到了一个“队列溢出”的问题。
这是因为在实现队列时,我们没有考虑到队列的容量限制。
通过添加一个检查队列长度的条件语句,我们避免了这个问题。
四、实验总结与反思通过本次实验,我们对栈和队列这两种基本的数据结构有了更深入的理解。
我们掌握了如何使用Python语言实现这两种数据结构,并了解了它们的基本操作和实际应用。
在实现栈和队列的过程中,我们也学到了很多关于编程的技巧和方法。
例如,如何调试代码、如何设计数据结构、如何优化算法等。
这些技巧和方法将对我们今后的学习和工作产生积极的影响。
然而,在实验过程中我们也发现了一些不足之处。
例如,在实现栈和队列时,我们没有考虑到异常处理和性能优化等方面的问题。
第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
栈与队列,各有异同。
栈与队列,各有异同。
⾸先是两者的定义:栈也称为堆栈,是⼀种线性表。
栈的特性:最先放⼊栈中的内容最后被拿出来,最后放⼊栈中的内容最先被拿出来,被称为先进后出、后进先出。
队列也是⼀种特殊的线性表。
不同于栈所服从的先进后出的原则,队列的原则是先进先出。
队列在队头做删除操作,在队尾做插⼊操作。
然后是两者的异同点不同点: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,可以说是屡战屡败,屡败屡战了,先是⼀点思路都没有,再到后来⽼师提⽰后有⼀点思路,但还是错误百出,再到后来参照书上的⽅法,还是错误,最后终于发现问题。
第3章 栈和队列
显然,为循环队列所分配的空间可以被充分利 用,除非向量空间真的被队列元素全部占用, 否则不会上溢。因此,真正实用的顺序队列是循环队列。 例:设有循环队列QU[0,5],其初始状态是 front=rear=0,各种操作后队列的头、尾指针的状态变 化情况如下图3-7所示。
rear front front 1 2 4 3 rear
队尾(rear) :允许进行插入的一端称为队尾。
队列中没有元素时称为空队列。在空队列中依次加入元 素a1, a2, …, an之后,a1是队首元素,an是队尾元素。显然 退出队列的次序也只能是a1, a2, …, an ,即队列的修改是 依先进先出的原则进行的,如图3-5所示。
出队
a1 , a2 , … , an
◆ 入队:将新元素插入rear所指的位置,然后rear加1。
在非空队列里,队首指针始终指向队头元素,而队尾指 针始终指向队尾元素的下一位置。 顺序队列中存在“假溢出”现象。因为在入队和出队操 作中,头、尾指针只增加不减小,致使被删除元素的空间 永远无法重新利用。因此,尽管队列中实际元素个数可能 远远小于数组大小,但可能由于尾指针已超出向量空间的 上界而不能做入队操作。该现象称为假溢出。
结点进栈:首先将数据元素保存到栈顶(top所指的当前位置),然后执
行top加1,使top指向栈顶的下一个存储位置;
结点出栈:首先执行top减1,使top指向栈顶元素的存储位置,然后将栈
顶元素取出。
3.1.2.2 栈的静态顺序存储表示
采用静态一维数组来存储栈。
◆ 栈底固定不变的;栈顶则随着进栈和退栈操作而变化,用一个整型变量top(称为 栈顶指针)来指示当前栈顶位置。 ◆ 用top=0表示栈空的初始状态,每次top指向栈顶在数组中的存储位置。 ◆
栈和队列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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章 栈和队列
19
销毁栈
void ClearStack(SqStack *&s) { free(s); }
第三章 栈和队列
20
求栈的长度
int StackLength(SqStack *s) { return(s->top+1); }
第三章 栈和队列
21
判断栈空运算
int StackEmpty(SqStack *s) { if(s->top==-1) return 1; else return 0; }
第三章 栈和队列
32
销毁栈
void ClearStack(LiStack *&s) { LiStack *p=s->next; while (p!=NULL) { free(s); s=p; p=p->next; } }
第三章 栈和队列 33
求栈的长度
int StackLength(LiStack *s) { int i=0; LiStack *p; p=s->next; while (p!=NULL) { i++;p=p->next; } return(i); }
取栈顶元素运算
int GetTop(LiStack *s,ElemType &e) { if (s->next==NULL) return 0; /*栈空的情况*/ e=s->next->data; return 1; }
第三章 栈和队列
40
显示栈中元素
void DispStack(LiStack *s) { LiStack *p=s->next; while (p!=NULL) { printf("%c ",p->data); p=p->next; } printf("\n"); }
第三章 栈和队列 25
显示栈中元素
void DispStack(SqStack *s) { int i; for (i=s->top;i>=0;i--) printf("%c ",s->data[i]); printf("\n"); }
第三章 栈和队列 26
顺序栈的应用
顺序栈应用
第三章 栈和队列
第三章 栈和队列 5
例3.2 设有4个元素a、b、c、d进栈,给出 它们所有可能的出栈次序。 答:所有可能的出栈次序如下: abcd abdc acbd acdb adcb bacd badc bcad bcda bdca cbad cbda cdba dcba
第三章 栈和队列
6
例3.3 设一个栈的输入序列为A,B,C,D,则借助 一个栈所得到的输出序列不可能是 。 (A) A,B,C,D (C) A,C,D,B (B) D,C,B,A (D) D,A,B,C
储空间。 求栈的长度StackLength(s) :返回栈s中的 元素个数。 判断栈是否为空StackEmpty(s) :若栈s为 空,则返回真;否则返回假。
第三章 栈和队列 10
进栈Push(&S,e) :将元素e插入到栈s中作
为栈顶元素。 出栈Pop(&s,&e) :从栈s中退出栈顶元素, 并将其值赋给e。 取栈顶元素GetTop(s,&e) :返回当前的栈 顶元素,并将其值赋给e。 显示栈中元素DispStack(s) :从栈顶到栈 底顺序显示栈中所有元素。
素,an为栈顶元素。 栈的修改是按后进先出的原则进行的。 因此,栈又称为后进先出(last in first out) 的线性表(简称LIFO结构)。 栈顶的当前位置是动态的,栈顶的当前位 置由一个称为栈顶指针的位置指示器指 示。
第三章 栈和队列 3
进栈
an
出栈
出栈
进栈
a2 a1
第三章 栈和队列 4
第三章 栈和队列
17
顺序栈的4要素
栈空条件:s.top==-1 栈满条件:s.top==StackSize-1
进栈操作:s.top++;元素进栈
出栈操作:元素退栈;s.top--
第三章 栈和队列
18
初始化栈运算
void InitStack(SqStack *&s) { s=(SqStack *)malloc(sizeof(SqStack)); s->top=-1; }
. . .
例3.1 设读入数据元素序列 {a,b,c,d,e,f,g},进栈操作和出栈操作可 以任意进行(排除栈为空时的出栈操作 情况),下列哪些数据元素序列可由出 堆栈序列得到(用S表示入栈,用X表 示出栈。 ① {d,e,c,f,b,g,a} SSSSXSXXSXXSXX
② {f,e,g,d,a,c,b} ③ {e,f,d,g,b,c,a} ④ {c,d,b,e,f,a,g} SSSSSSXXSXS错误 SSSSSXSXXSX错误 SSSXSXXSXSXXSX
第三章 栈和队列 11
分析栈运算
1. InitStack(s); 初始化堆栈s 2. Push(s, 'a'); 3. Push(s, 'b'); 4. Pop(s,x); 将元素‘a’进栈 将元素‘b’进栈
将栈顶元素 ‘b’出栈赋给 x 5. x=GetTop(s); 返回栈顶元素‘a’赋给x
第三章 栈和队列 12
第三章 栈和队列 37
出栈运算
data next s p an an-1 栈顶
a1
^
栈底
第三章 栈和队列
38
int Pop(LiStack *&s,ElemType &e) { LiStack *p; if (s->next==NULL) return 0; /*栈空的 情况*/ p=s->next; /*p指向第一个数据结点*/ e=p->data; s->next=p->next; free(p); return 1; } 39 第三章 栈和队列
data
top
4
3 2 D C
4
3 top 2
1
0 (c)
B A
1
0 (d)
B A
第三章 栈和队列
15
data 5 4
3
2 1
0 top
-1 (a)
第三章 栈和队列 16
顺序栈类型
typedef struct sqst { ElemType data[StackSize]; int top; }SqStack;
3.1.2 栈的顺序存储结构及其基本
运算实现
顺序栈:栈的顺序存储结构 数组data[]:存放栈的数据元素值
栈顶标志top:记录栈顶位置
第三章 栈和队列
13
data 5 4 3 2 1 0 top -1 top 5 4 3 2 1 0 (b)
第三章 栈和队列
data
A
(a)
14
data 5 5
出栈运算
int Pop(SqStack *&s,ElemType &e) { if (s->top==-1) return 0; /*栈为空的情况,即栈下溢出*/ e=s->data[s->top]; s->top--; return 1; }
第三章 栈和队列 24
取栈顶元素运算
int GetTop(SqStack *s,ElemType &e) { if (s->top==-1) return 0; /*栈为空的情况,即栈下溢出*/ e=s->data[s->top]; return 1; }
第三章 栈和队列 22
进栈运算
int Push(SqStack *&s,ElemType e) { if (s->top==MaxSize-1) return 0; /*栈满的情况,即栈上溢出*/ s->top++; s->data[s->top]=e; return 1; }
第三章 栈和队列 23
答:当p1=3时,说明1,2,3先进栈,立即出栈3,然后可 能出栈,即为2,也可能4或后面的元素进栈,再出栈。 因此,p2可能是2,也可能是4,…,n,但一定不能是1。所 以本题答案为C。
第三章 栈和队列 9
栈的基本运算
初始化栈InitStack(s):设置一个空栈。 销毁栈ClearStack(&s) :释放栈s占用的存
答:可以简单地推算,得容易得出D,A,B,C是 不可能的,因为D先出来,说明A,B,C,D均在栈中, 按照入栈顺序,在栈中顺序应为D,C,B,A,出栈的 顺序只能是D,C,B,A。所以本题答案为D。
第三章 栈和队列 7
例3.3 已知一个栈的进栈序列是1,2,3,…,n,其输出 序列是p1,p2,…,pn,若p1=n,则pi的值 。 (A) i (B) n-i
链栈示意图
第三章 栈和队列 29
链栈的类型定义
链栈中数据结点的类型LiStack定义如下: typedef struct linknode { ElemType data; /*数据域*/ struct linknode *next; /*指针域*/ } LiStack;
第三章 栈和队列 30
链栈的4个要素
栈空条件:s->next==NULL; 栈满条件:无空间分配
进栈操作:创建结点*p,将其插入到栈
顶位置上 出栈操作:删除栈顶位置的结点
第三章 栈和队列
31
初始化链栈
void InitStack(LiStack *&s) { s=(LiStack *)malloc(sizeof(LiStack)); s->next=NULL; }