第3章 栈
DS第三章 栈和队列
选择题(1):经过以下栈运算后,x的值是( )。 IniStack(s);Push(s,a);Push(s,b); Pop(s,x);GetTop(s,x); A. a B. b C. 1 D. 0 【解答】A 【分析】本题要求熟悉栈的基本操作,理解所给运算 的含义。 IniStack(s)表示对栈s进行初始化; Push(s,a)表示将元素a压入栈s中; Pop(s,x) 表示 将栈s的栈顶元素弹出并送入变量x中;GetTop(s,x) 表示取栈顶元素并送入变量x中但不删除该元素。
第3章 栈和队列
3.2 栈 考核知识点 3. 栈的基本操作(★★★) 栈初始化:StackInit() 判栈空:StackEmpty(S),栈为空返回1,否则为0 入栈:Push(S,x) 出栈:Pop(S) 读栈顶元素:StackGetTop(S) 销毁栈:StackDestroy (S) 清空栈: StackClear (S) 求栈长:StackLength(S)
栈典型题解析
1. 选择题
主要考查栈的基本操作(初始化、进栈、出栈、 判空等)在不同存储结构(顺序栈和链栈)下 的执行过程,对于顺序栈注意栈底的位置和栈 顶指针的变化,对于栈链注意如何用链表实现 栈以及插入和删除操作的位置。 栈最重要的考点是元素以同样顺序进栈后判断 出栈的不同情况,两栈共享空间也是一个常见 的考点,注意存储方法、栈底的位置和栈顶指 针的变化。
选择题(11):向一个栈顶指针为h的带头结点 的链栈中插入指针s所指的结点时,应执行 ( )。 A. h->next=s; B. s->next=h; C. s->next=h; h->next=s; D. s->next=h->next; h->next=s; 【解答】D 【分析】结点s应插在头结点的后面。
第三章 栈和队列
栈和队列的基本操作是线性表操作的子集,是限定性(操作受限制)的数据结构。
第三章栈和队列数据结构之栈和队列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 栈与递归¾递归函数:一个直接调用自己或通过一系列的调用语句间接地调用自己的函数。
数据结构练习题第三章栈、队列和数组习题及答案
第三章栈、队列和数组一、名词解释: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{________________:________________=x;return(1);}}9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。
第三章 特殊线性表
(6)撤消动态申请空间Destroy(*head)
void Destroy(LSNode *head) { LSNode *p, *p1;
p = head;
while(p != NULL)
{ p1 = p;
p = p->next;
free(p1); }
}
3.2 堆栈应用
1、括号匹配问题
例:假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号, 编写一个判别表达式中括号是否正确配对的函数,并设计一个测试主函数。 算法思想: 算术表达式中右括号和左括号匹配的次序正好符合后到的括号要最先 被匹配的“后进先出”堆栈操作特点,因此可以借助一个堆栈来进行判断。 括号匹配共有四种情况: (1)左右括号配对次序不正确;(2)右括号多于左括号; (3)左括号多于右括号; (4)左右括号匹配正确。 具体方法:顺序扫描算术表达式(表现为一个字符串),当遇到三种类型 的左括号时让该括号进栈;当扫描到某一种类型的右括号时,比较当前栈 顶括号是否与之匹配,若匹配则退栈继续进行判断;若当前栈顶括号与当 前扫描的括号不相同,则左右括号配对次序不正确;若字符串当前为某种 类型左括号而堆栈已空,则右括号多于左括号;字符串循环扫描结束时, 若堆栈非空(即堆栈中尚有某种类型左括号),则说明左括号多于右括号; 否则,左右括号匹配正确。
中缀表达式变换为后缀表达式的算法步骤可以总结 为: (1)设置一个堆栈,初始时将栈顶元素置为“#”。 (2)顺序读入中缀表达式,当读到的单词为操作数时 就将其输出,并接着读下一个单词。 (3)令x1为当前栈顶运算符的变量,x2为当前扫描读 到运算符的变量,当顺序从中缀表达式中读入的单词为 运算符时就赋予x2,然后比较x1的优先级与x2的优先级, 若x1的优先级高于x2的优先级,将x1退栈并作为后缀表 达式的一个单词输出,然后接着比较新的栈顶运算符x1 的优先级与x2的优先级。
第三章 栈
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 )
第三章栈和队列练习题
第三章栈和队列练习题一、单项选择题1.一个顺序栈一旦被声明,其占用空间的大小()。
A.已固定B.可以改变C.不能固定D.动态变化2.链栈和顺序栈相比,有一个比较明显的缺点,即()。
A.插入操作更加方便B.通常不会出现栈满的情况C.不会出现栈空的情况D.删除操作更加方便3.用单链表表示的链式队列的队头在链表的()位置。
A.链头B.链尾C.链中D.任意位置4.在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印数据缓冲区,主机将要输出的数据依次写入缓冲区中,而打印机则从缓冲区中取出数据打印,该缓冲区应该是一个()结构。
A.堆栈B.队列C.数组D.先性表5.若已知一个栈的入栈序列是1,2,3,…,30,其输出序列是p1,p2,p3,…p n,若p1=30,则p10为()。
A.11 B.20 C.19 D.216.循环队列A[m] 存放其元素,用front和rear分别表示队头及队尾,则循环队列满的条件是()。
A.(rear+1)%m=front B.rear =front+1C.rear=front D.(rear+1)%m-1=front7.在一个栈顶指针为top的链栈中,将一个p指针所指的结点入栈,应执行()。
A.top->next=p; B.p->next=top->next; top->next=p;C.p->next=top; top=p; D.p->next=top->next; top=top->next;8.在一个栈顶指针为top的链栈中删除一个结点时,用x保存被删结点的值,则执行()。
A.x=top;top=top->next; B.x=top->data;C.top=top->next; x=top->data; D.x=top->data; top=top->next;9.表达式a*(b+c)-d的后缀表达式是()。
数据结构(C++版)第3章 特殊线性表
特殊线性表——栈
3.1.3 栈的链接存储结构及实现
链栈:栈的链接存储结构 first
a1
a2
ai
an ∧
将哪一端作为栈顶? 将链头作为栈顶,方便操作。 链栈需要加头结点吗? 链栈不需要附设头结点。
特殊线性表——栈
栈的链接存储结构及实现
链栈:栈的链接存储结构 first top an
栈顶
a1
a2 a1 ∧
Pop( );
an
an-1
a1 ∧
特殊线性表——栈
顺序栈和链栈的比较
时间性能:相同,都是常数时间O(1)。
空间性能: 顺序栈:有元素个数的限制和空间浪费的问题。 链栈:没有栈满的问题,只有当内存没有可用空间时才会 出现栈满,但是每个元素都需要一个指针域,从而产生了 结构性开销。 结论:当栈的使用过程中元素个数变化较大时,用链栈是适 宜的,反之,应该采用顺序栈。
两栈共享空间
两栈共享空间
0 1 2 ……
S-1
a 1 a2 … ai
栈1底
bj … … b2 b 1
top2
栈2底
top1
栈1的底固定在下标为0的一端; 栈2的底固定在下标为StackSize-1的一端。 top1和top2分别为栈1和栈2的栈顶指针; Stack_Size为整个数组空间的大小(图中用S表示);
an
an-1
p
a1 ∧ top++可以吗?
特殊线性表——栈
链栈的实现——链栈的析构(链栈的销毁)
template <class T> LinkStack<T>::~LinkStack( ) {
Node<T> *p;
《数据结构》习题集:第3章 栈和队列
第3章栈和队列一、选择题1.栈结构通常采用的两种存储结构是(A )。
A、顺序存储结构和链表存储结构B、散列和索引方式C、链表存储结构和数组D、线性链表结构和非线性存储结构2.设栈ST 用顺序存储结构表示,则栈ST 为空的条件是( B )A、ST.top-ST.base<>0B、ST.top-ST.base==0C、ST.top-ST.base<>nD、ST.top-ST.base==n3.向一个栈顶指针为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;4.从一个栈顶指针为HS 的链栈中删除一个结点,用x 保存被删除结点的值,则执行( C)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;5.表达式a*(b+c)-d 的后缀表达式为( B )A、abcdd+-B、abc+*d-C、abc*+d-D、-+*abcd6.中缀表达式A-(B+C/D)*E 的后缀形式是( D )A、AB-C+D/E*B、ABC+D/E*C、ABCD/E*+-D、ABCD/+E*-7.一个队列的入列序列是1,2,3,4,则队列的输出序列是( B )A、4,3,2,1B、1,2,3,4C、1,4,3,2D、3,2,4,18.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队列为空的条件是()A、Q.rear-Q.front==nB、Q.rear-Q.front-1==nC、Q.front==Q.rearD、Q.front==Q.rear+19.循环队列SQ 采用数组空间SQ.base[0,n-1]存放其元素值,已知其头尾指针分别是front 和rear,则判定此循环队列为满的条件是()A、Q.front==Q.rearB、Q.front!=Q.rearC、Q.front==(Q.rear+1)%nD、Q.front!=(Q.rear+1)%n10.若在一个大小为6 的数组上实现循环队列,且当前rear 和front 的值分别为0 和3,当从队列中删除一个元素,再加入两个元素后,rear 和front 的值分别为()A、1,5B、2, 4C、4,2D、5,111.用单链表表示的链式队列的队头在链表的()位置A、链头B、链尾C、链中12.判定一个链队列Q(最多元素为n 个)为空的条件是()A、Q.front==Q.rearB、Q.front!=Q.rearC、Q.front==(Q.rear+1)%nD、Q.front!=(Q.rear+1)%n13.在链队列Q 中,插入s 所指结点需顺序执行的指令是()A 、Q.front->next=s;f=s;B 、Q.rear->next=s;Q.rear=s;C 、s->next=Q.rear;Q.rear=s;D 、s->next=Q.front;Q.front=s;14.在一个链队列Q 中,删除一个结点需要执行的指令是()A、Q.rear=Q.front->next;B、Q.rear->next=Q.rear->next->next;C、Q.front->next=Q.front->next->next;D、Q.front=Q.rear->next;15.用不带头结点的单链表存储队列,其队头指针指向队头结点,队尾指针指向队尾结点,则在进行出队操作时()A、仅修改队头指针B、仅修改队尾指针C、队头尾指针都要修改D、队头尾指针都可能要修改。
《数据结构》填空作业题(答案)
《数据结构》填空作业题答案第1章绪论(已校对无误)1.数据结构包括数据的逻辑结构、数据的存储结构和数据的运算三方面的内容。
2.程序包括两个内容:数据结构和算法。
3. 数据结构的形式定义为:数据结构是一个二元组:Data Structure =(D,S)。
4. 数据的逻辑结构在计算机存储器内的表示,称为数据的存储结构。
5. 数据的逻辑结构可以分类为线性结构和非线性结构两大类。
6. 在图状结构中,每个结点的前驱结点数和后继结点数可以有多个。
7. 在树形结构中,数据元素之间存在一对多的关系。
8. 数据的物理结构,指数据元素在计算机中的标识(映象),也即存储结构。
9. 数据的逻辑结构包括线性结构、树形结构和图形结构3种类型,树型结构和有向图结构合称为非线性结构。
10. 顺序存储结构是把逻辑上相邻的结点存储在物理上连续的存储单元里,结点之间的逻辑关系由存储单元位置的邻接关系来体现。
11. 链式存储结构是把逻辑上相邻的结点存储在物理上任意的存储单元里,节点之间的逻辑关系由附加的指针域来体现。
12. 数据的存储结构可用4种基本的存储方法表示,它们分别是顺序存储、链式存储、索引存储和散列存储。
13. 线性结构反映结点间的逻辑关系是一对一的,非线性结构反映结点间的逻辑关系是一对多或多对多。
14. 数据结构在物理上可分为顺序存储结构和链式存储结构。
15. 我们把每种数据结构均视为抽象类型,它不但定义了数据的表示方式,还给出了处理数据的实现方法。
16. 数据元素可由若干个数据项组成。
17. 算法分析的两个主要方面是时间复杂度和空间复杂度。
18. 一个算法的时间复杂度是用该算法所消耗的时间的多少来度量的,一个算法的空间复杂度是用该算法在运行过程中所占用的存储空间的大小来度量的。
19. 算法具有如下特点:有穷性、确定性、可行性、输入、输出。
20. 对于某一类特定的问题,算法给出了解决问题的一系列操作,每一操作都有它的确切的定义,并在有穷时间内计算出结果。
第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
第三章_表、栈和队列
6
1.表ADT
带表头的单链表
head a1 a2
存储地址 22
an ∧
数据域
指针域
单链表存储结构 示意图
a2
…
86
head
38 38
…
94
86 94
物理与电子学院-数据结构
… a3
… NULL
22
7
a1
1.表ADT
.h文件
物理与电子学院-数据结构
8
1.表ADT
IsEmpty O(1) IsLast O(1) Find O(N)
12
1.表ADT
双(向)链表
Prior Element Next
A B C
head
tail
初态
head
tail
物理与电子学院-数据结构
13
1.表ADT
双链表的删除
c a b tail
head
Current
head c
a
b
tail
Current ->Prior->Next = current ->Next
3
2 1 0 top top top
D C B A
C B A
B A
top
A
top
空栈 栈空: top == -1
stacksize = = 4
物理与电子学院-数据结构
top 指针指示真正的栈顶元素 的下标地址。 栈满时的处理方法: 1、报错。返回操作系统。 2、分配更大的空间,作为新 栈,将 原栈的内容移入新栈。
head
c
Current
PTA第三章栈和队列练习题
1-1通过对堆栈S 操作:Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S)。
输出的序列为:123。
(2分)TF 作者: DS 课程组单位: 浙江大学 1-2在用数组表示的循环队列中,front 值一定小于等于rear 值。
(1分)TF 作者: DS 课程组单位: 浙江大学 1-3若一个栈的输入序列为{1, 2, 3, 4, 5},则不可能得到{3, 4, 1, 2, 5}这样的出栈序列。
(2分)TF 作者: 徐镜春单位: 浙江大学 1-4If keys are pushed onto a stack in the order {1, 2, 3, 4, 5}, then it is impossible to obtain the output sequence {3, 4, 1, 2, 5}. (2分)TF 作者: 徐镜春单位: 浙江大学 1-5所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。
(1分)TF 作者: DS 课程组单位: 浙江大学 1-6An algorithm to check for balancing symbols in an expression uses a stack to store the symbols. (1分)T F 2-1设栈S 和队列Q 的初始状态均为空,元素a 、b 、c 、d 、e 、f 、g 依次进入栈S 。
若每个元素出栈后立即进入队列Q ,且7个元素出队的顺序是b 、d 、c 、f 、e 、a 、g ,则栈S 的容量至少是: (2分)1. 12. 23. 34. 4作者: DS课程组单位: 浙江大学2-2若元素a、b、c、d、e、f依次进栈,允许进栈、退栈操作交替进行,但不允许连续三次进行退栈工作,则不可能得到的出栈序列是?(2分)1. b c a e f d2. c b d a e f3. d c e b f a4. a f e d c b作者: DS课程组单位: 浙江大学2-3设一个栈的输入序列是1、2、3、4、5,则下列序列中,是栈的合法输出序列的是?(2分)1. 3 2 1 5 42. 5 1 2 3 43. 4 5 1 3 24. 4 3 1 2 51.PPPOOOPPOPPOOO2.POPOPOPPOPPOOO3.POPPOOPPOPOOPO4.POPPOOPPOPPOOO作者: DS课程组单位: 浙江大学2-5设一个堆栈的入栈顺序是1、2、3、4、5。
数据结构与算法第3章课后答案
第 3 章特殊线性表——栈、队列和串(2005-07-14) -第 3 章特殊线性表——栈、队列和串课后习题讲解1. 填空⑴设有一个空栈,栈顶指针为1000H,现有输入序列为1、2、3、4、5,经过push,push,pop,push,pop,push,push后,输出序列是(),栈顶指针为()。
【解答】23,1003H⑵栈通常采用的两种存储结构是();其判定栈空的条件分别是(),判定栈满的条件分别是()。
【解答】顺序存储结构和链接存储结构(或顺序栈和链栈),栈顶指针top= -1和top=NULL,栈顶指针top等于数组的长度和内存无可用空间⑶()可作为实现递归函数调用的一种数据结构。
【解答】栈【分析】递归函数的调用和返回正好符合后进先出性。
⑷表达式a*(b+c)-d的后缀表达式是()。
【解答】abc+*d-【分析】将中缀表达式变为后缀表达式有一个技巧:将操作数依次写下来,再将算符插在它的两个操作数的后面。
⑸栈和队列是两种特殊的线性表,栈的操作特性是(),队列的操作特性是(),栈和队列的主要区别在于()。
【解答】后进先出,先进先出,对插入和删除操作限定的位置不同⑹循环队列的引入是为了克服()。
【解答】假溢出⑺数组Q[n]用来表示一个循环队列,front为队头元素的前一个位置,rear为队尾元素的位置,计算队列中元素个数的公式为()。
page: 2The Home of jetmambo - 第 3 章特殊线性表——栈、队列和串【解答】(rear-front+n)% n【分析】也可以是(rear-front)% n,但rear-front的结果可能是负整数,而对一个负整数求模,其结果在不同的编译器环境下可能会有所不同。
⑻用循环链表表示的队列长度为n,若只设头指针,则出队和入队的时间复杂度分别是()和()。
【解答】O(1),O(n)【分析】在带头指针的循环链表中,出队即是删除开始结点,这只需修改相应指针;入队即是在终端结点的后面插入一个结点,这需要从头指针开始查找终端结点的地址。
李春葆《数据结构教程》(C++语言描述)配套题库【课后习题】(栈和队列)
A.top++;data[top]=x;
4 / 21
圣才电子书 十万种考研考证电子书、题库视频学习平台
B.data[top]=x;top++; C.top--;data[top]=x; D.data[top]=x;top--; 【答案】A 【解析】与上两题类似,此题中栈顶指针所指的元素为 i,而此时要进栈的元素在数组 中的位置为 data[i+1],因此需要先修改栈顶指针令其加 1,再将元素放入数组中,答案为 A 项。
因此答案为 C 项。
(12)栈和队列的不同点是______。 A.都是线性表 B.都不是线性表 C.栈只能在一端进行插入、删除操作,而队列在不同端进行插入、删除操作 D.没有不同点 【答案】C 【解析】栈为先进后出,意味着其只能在一端进行插入、删除操作,而队列为先进先出, 意味着其可以不同端进行插入、删除操作,所以答案为 C 项。
3 / 21
圣才电子书 十万种考研考证电子书、题库视频学习平台
A.top++;data[top]=x; B.data[top]=x;top++; C.top--;data[top]=x; D.data[top]=x;top--; 【答案】C 【解析】元素 x 进栈时,需要先修改栈顶指针指向栈顶元素的位置,而由题干可知,此 栈的栈顶指针的值应为 n+1-i,其中 i 为栈中已有元素的个数,因此第一步需要先将栈顶指 针减 1,再将元素放入栈顶指针所指位置,因此答案为 C 项。
(6)表达式(a+a*b)*a+C*b/a 的后缀表达式是______。 A.a a b*+a*c b*a/+ B.a a*b+a*c b*a/+ C.a a b*a*c b*+a/+ D.a a b*+a c b*a/+* 【答案】A 【解析】按照表达式到后缀表达式的原则可知,答案为 A 项。
数据结构C语言版第版习题答案—严蔚敏
数据结构(C语言版)(第2版)课后习题答案李冬梅2015.3目录第1章绪论.................................................................................................................... 第2章线性表 ................................................................................................................ 第3章栈和队列 ............................................................................................................ 第4章串、数组和广义表 ............................................................................................. 第5章树和二叉树......................................................................................................... 第6章图 ......................................................................................................................... 第7章查找.................................................................................................................... 第8章排序....................................................................................................................第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
第3章演示
3.1.2 栈的表示和实现
2. 链栈 链栈是用链式存储结构实现的栈,即利用不连续 的存储单元依次存放自栈底到栈顶的数据元素。
说明: (1)头指针就是栈顶指针top; (2) 链表结点指针指向前一个入栈的元素,体现入栈 的先后顺序; (3)既为链栈,则插入/删除操作只能在链表头结点处 进行。
3.1.3 栈的应用举例 一、 数制转换 对于输入的任意一个非负十进制整数,打印输 出与其等值的八进制数。 例如:(1348)10=(?)8 从其计算过程进行分析,可以发现将十进制数 N转换为八进制数,在重复执行如下两步: X = N mod 8 (其中mod为求余运算) N = N div 8 (其中div为整除运算) 直到N为0
1. 顺序栈 (2) 算法的实现
③判栈满。
int Stackoverflow(SqStack S)
/*判栈S为满栈时返回值为真, 反之为假*/
{return(S.top==MAXSIZE-1?TRUE:FALSE);}
1. 顺序栈 (2) 算法的实现 ④ 进栈。 <i> 判栈满; <ii>将栈顶指针top上移,存入元素。 ⑤ 出栈。 <i> 判栈空; <ii> 取出栈顶元素,将栈顶指针top下移; <iii>返回栈顶元素。
3.1.3 栈的应用举例 二、 算术表达式求值 1、算术四则运算的规则 2、表达式的构成规则 3、算法分析 (1)规定优先级表 (2)使用两个工作栈:optr 算符栈和opnd操作数栈
4、程序实现
3.1.3 栈的应用举例 二、 算术表达式求值 1、算术四则运算的规则: (1)括号优先级最高; (2)先乘除,后加减; (3)同优先级的遵循从左向右的结合性。
《数据结构》填空作业题(答案)
《数据结构》填空作业题答案第1章绪论(已校对无误)1.数据结构包括数据的逻辑结构、数据的存储结构和数据的运算三方面的内容。
2.程序包括两个内容:数据结构和算法。
3。
数据结构的形式定义为:数据结构是一个二元组:Data Structure =(D,S).4. 数据的逻辑结构在计算机存储器内的表示,称为数据的存储结构。
5。
数据的逻辑结构可以分类为线性结构和非线性结构两大类。
6. 在图状结构中,每个结点的前驱结点数和后继结点数可以有多个。
7。
在树形结构中,数据元素之间存在一对多的关系。
8。
数据的物理结构,指数据元素在计算机中的标识(映象),也即存储结构.9。
数据的逻辑结构包括线性结构、树形结构和图形结构3种类型,树型结构和有向图结构合称为非线性结构。
10. 顺序存储结构是把逻辑上相邻的结点存储在物理上连续的存储单元里,结点之间的逻辑关系由存储单元位置的邻接关系来体现。
11. 链式存储结构是把逻辑上相邻的结点存储在物理上任意的存储单元里,节点之间的逻辑关系由附加的指针域来体现。
12. 数据的存储结构可用4种基本的存储方法表示,它们分别是顺序存储、链式存储、索引存储和散列存储。
13. 线性结构反映结点间的逻辑关系是一对一的,非线性结构反映结点间的逻辑关系是一对多或多对多.14. 数据结构在物理上可分为顺序存储结构和链式存储结构。
15. 我们把每种数据结构均视为抽象类型,它不但定义了数据的表示方式,还给出了处理数据的实现方法。
16。
数据元素可由若干个数据项组成。
17。
算法分析的两个主要方面是时间复杂度和空间复杂度。
18。
一个算法的时间复杂度是用该算法所消耗的时间的多少来度量的,一个算法的空间复杂度是用该算法在运行过程中所占用的存储空间的大小来度量的。
19。
算法具有如下特点:有穷性、确定性、可行性、输入、输出。
20. 对于某一类特定的问题,算法给出了解决问题的一系列操作,每一操作都有它的确切的定义,并在有穷时间内计算出结果.21. 下面程序段的时间复杂度为㏒3n 。
北京林业大学《数据结构与算法》课件PPT第3章 栈和队列
3.3 栈的表示和操作的实现
“进” =压入=PUSH() “出” =弹出=POP( )
北京林业大学信息学院
2021年4月24日
顺序栈与顺序表
顺序表V[n]
高地址
表尾
an
……
v[i]
ai
……
低地址
a2
a1
表头
写入:v[i]= ai 读出: x= v[i]
高地址 低地址
顺序栈S
an+1
2021年4月24日
栈(Stack) 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
队列(Queue) 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式
北京林业大学信息学院
2021年4月24日
栈
北京林业大学信息学院
用铁路调度站表示栈
2021年4月24日
出队列 a1 a2 a3 ... an
队
队
头
尾
北京林业大学信息学院
2021年4月24日
3.1 栈和队列的定义和特点
队列
1. 定义
只能在表的一端(队尾)进行插入, 在另一端(队头)进行删除运算的 线性表
2. 逻辑结构 与线性表相同,仍为一对一关系
3. 存储结构 用顺序队列或链队存储均可
北京林业大学信息学院
教学目标
1. 掌握栈和队列的特点,并能在相应的应用问
题中正确选用
2. 熟练掌握栈的两种存储结构的基本操作实现
算法,特别应注意栈满和栈空的条件
3. 熟练掌握循环队列和链队列的基本操作实现
算法,特别注意队满和队空的条件
4. 理解递归算法执行过程中栈的状态变化过程
数据结构1-4章习题答案
第1章概论习题参考解答一、填空题1、数据的逻辑结构是数据元素之间的逻辑关系,通常有下列4类:()、()、()、()。
【答】集合、线性结构、树型结构和图状结构。
2、数据的存储结构是数据在计算机存储器里的表示,主要有4种基本存储方法:()、()、()、()。
【答】顺序存储方法、链接存储方法、索引存储方法和散列存储方法。
二、选择题1、一个算法必须在执行有穷步之后结束,这是算法的()。
(A)正确性(B)有穷性(C)确定性(D)可行性【答】B。
2、算法的每一步,必须有确切的定义。
也就是说,对于每步需要执行的动作必须严格、清楚地给出规定。
这是算法的()。
(A)正确性(B)有穷性(C)确定性(D)可行性【答】C。
3、算法原则上都是能够由机器或人完成的。
整个算法好像是一个解决问题的“工作序列”,其中的每一步都是我们力所能及的一个动作。
这是算法的()。
(A)正确性(B)有穷性(C)确定性(D)可行性【答】D。
三、简答题1、算法与程序有何异同?【答】尽管算法的含义与程序非常相似,但两者还是有区别的。
首先,一个程序不一定满足有穷性,因此它不一定是算法。
例如,系统程序中的操作系统,只要整个系统不遭受破坏,它就永远不会停止,即使没有作业要处理,它仍处于等待循环中,以待一个新作业的进入。
因此操作系统就不是一个算法。
其次,程序中的指令必须是计算机可以执行的,而算法中的指令却无此限止。
如果一个算法采用机器可执行的语言来书写,那么它就是一个程序。
2、什么是数据结构?试举一个简单的例子说明。
【答】数据结构是指数据对象以及该数据对象集合中的数据元素之间的相互关系(即数据元素的组织形式)。
例如,队列的逻辑结构是线性表(先进先出);队列在计算机中既可以采用顺序存储也可以采用链式存储;对队列可进行删除、插入数据元素以及判断是否为空队列、将队列置空等操作。
3、什么是数据的逻辑结构?什么是数据的存储结构?【答】数据元素之间的逻辑关系,也称为数据的逻辑结构。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
typedef struct node
{ ElemType data;
struct node *next;
} LinkStack;
top
data
next
an-1 typedef struct stacknode{ DataType data struct stacknode *next }StackNode; StackNode *head=NULL; • typedef struct{ StackNode *top; //栈顶指针 }LinkStack; an-1
说明:设S是SeqStack类型的指针变量。若栈底位置在
向量的低端,即s–>data[0]是栈底元素,那么栈顶指 针s–>top是正向增加的,即进栈时需将s–>top加1, 退栈时需将s–>top 减1。因此,s–>top=0表示空栈, s–>top =stacksize表示栈满。当栈满时再做进栈运算 必定产生空间溢出,简称“上溢”;当栈空时再做退栈 运算也将产生溢出,简称“下溢”。上溢是一种出错 状态,应该设法避免之;下溢则可能是正常现象,因 为栈在程序中使用时,其初态或终态都是空栈,所以 下溢常常用来作为程序控制转移的条件。
由于栈是运算受限的线性表,因此线性表的存储 结构对栈也适应。 栈的顺序存储结构简称为顺序栈,它是运算受限 的线性表。因此,可用数组来实现顺序栈。因为栈底 位置是固定不变的,所以可以将栈底位置设置在数组 的两端的任何一个端点;栈顶位置是随着进栈和退栈 操作而变化的,故需用一个整型变量top来指示当前 栈顶的位置,通常称top为栈顶指针。
top top
top top
(1 ) 3 (1)w=3
(2) 2 (2)w=2 (1) 3 (1)w=3
(3) 1 (3)w=1 (2) 2 (2)w=2 (1) 3 (1)w=3
(4)w=0 (4) 0 (3)w=1 (3) 1 (2)w=2 (2) 2 (1)w=3 (1) 3
栈的实现
二、 顺序栈
栈1底 栈1顶 图 两个栈共享存储单元示意图 栈2顶 栈2底
两个共享存储单元顺序栈的操作演示
顺序栈的不足:
存在栈满以后就不能再进栈的问题
(这是因为用了定长的数组存储栈的元素)
解决方法: 使用链式存储结构。
3.1.3 链栈
栈的链式存储结构称为链栈,它的运算是受限 的单链表,插入和删除操作仅限制在表头位置上 进行。由于只能在链表头部进行操作,故链表没 有必要像单链表那样附加头结点。栈顶指针就是 链表的头指针。链栈的类型说明如下:
例1:计算机系2001年考研题(程序设计基础) 设依次进入一个栈的元素序列为c,a,b,d, 则可得到出栈的元素序列是:
A)a,b,c,d C)b,c,d,a
B)c,d,a,b D)a,c,d,b
答: A、D可以( B、C不行)。
例2:一个栈的输入序列是12345,若在入栈的过程 中允许出栈,则栈的输出序列43512可能实现吗? 12345的输出呢? 43512不可能实现,主要是其中的12顺序不能实现; 答:
栈和队列是两种特殊的线性表,是操作受 限的线性表,称限定性数据结构。 栈 栈的应用 队列 队列的应用
3.1 栈(stack)
一、 栈的定义:限定仅在表尾进行插入或删 除操作的线性表,表尾—栈顶,表头—栈底, 不含元素的空表称空栈
进栈 栈 顶 出栈 ... an ……... a2 栈底 a1 栈s=(a1,a2,……,an)
栈的共享存储单元
有时,一个程序设计中,需要使用多个同一类型的栈,这 时候,可能会产生一个栈空间过小,容量发生溢出,而 另一个栈空间过大,造成大量存储单元浪费的现象。 为 了充分利用各个栈的存储空间,这时可以采用多个栈共 享存储单元,即给多个栈分配一个足够大的存储空间, 让多个栈实现存储空间优势互补。
入栈与出栈
top top top
top top bottom bottom
top
A
A进栈
bottom
E D C B A
top top top top
bottom
E D C B A
B C D E 进栈 栈操作图示
E D C 出栈
栈的特点
根据栈的定义可知,最先放入栈中元素在栈底,最后 放入的元素在栈顶,而删除元素刚好相反,最后放入 的元素最先删除,最先放入的元素最后删除。 也就是说,栈是一种后进先出(Last In First Out)的 线性表,简称为LIFO表。
4. 栈中的元素个数可以是0,此时是空栈;
5. 栈的元素的个数是可以变化的,可以是多 个,但不能是无穷多个; 6. 每个栈中的元素的类型相同.
栈的应用
过程的嵌套调用 子 过 程 1 子 过 程 2
r
主 程 序
r
s r
t s r
子 过 程 3
s
t
r
s r
递归过程及其实现
递归:函数直接或间接的调用自身叫~ 实现:建立递归工作栈
6、取栈顶元素
当s所指的栈不为空时,将栈顶元素取出,而栈本 身未发生任何变化。 ElemType stacktop(seqstack *s) { if(stackempty(s) error(“stack is empty”); return s .data[s.top-1]; }
顺序栈的操作演示
栈满 5 top top top top top top F E D C B A 进栈 top top top top top top top
栈空
5
4 3 2 1 0
F E D C
B A 出栈
5 4 3
4 3
2 1 top=0 0 栈空
2 1 0
栈顶指针top,指向实际栈顶 后的空位置,初值为0
设数组维数为M top=0,栈空,此时出栈,则下溢(underflow) top=M,栈满,此时入栈,则上溢(overflow)
3124
4123 4213
1234
1432 2341 3421
1243
2134 2431 4321
1324
2143 3241
1342
2314 3214
水平考试试题
栈是一种线性表,它的特点是 A 。设用一维数组 A[1,…,n]来表 示一个栈,令A[n]为栈底。用整型变量T指示当前栈顶位置,A[T]为栈顶
12345的输出可以实现,只需压入一个立即弹出一个即可。
例3:如果一个栈的输入序列为123456,能否得到 435612和135426的出栈序列?
答:
435612中到了12顺序不能实现; 135426可以实现。
例4: 假设有A,B,C三个元素进S栈的顺序是A,B,C,写 出所有可能的出栈序列。
A进 A出 B进 B出 C进 C出 A进 A出 B进 C进 C出 B出 ABC ACB
一、教学内容:
1、栈和队列的定义及特点; 2、栈的顺序存储表示和链接存储表示; 3、队列的顺序存储表示;队列的链接存储表示; 4、栈和队列的应用举例。
二、教学要求:
1、掌握栈和队列的定义、特性,并能正确应用它们解决实际问题; 2、熟练掌握栈的顺序表示、链表表示以及相应操作的实现。特别注意栈空 和栈满的条件; 3、熟练掌握队列的顺序表示、链表表示以及相应操作的实现。特别是循环 队列中队头与队尾指针的变化情况
栈顶(单链 表的表头)
a0
栈底
注意:s->top 栈顶指针; s->top->data 栈顶元素
栈的链接表示 — 链式栈
• • • •
链式栈无栈满问题,空间可扩充 插入与删除仅在栈顶处执行 链式栈的栈顶在链头 适合于多栈操作
(1) 置栈空 • { void InitStack(LinkStack *S) S->top=NULL;
4、 进栈操作 (入栈)
进栈运算,表示栈中插入一个值为x的元素。
思路:当栈不满时,先把元素x放入栈顶变量所指的位置中, 然后修改栈顶变量,将其值加1
MAX-1 n n-1 n-2 1 0 MAX-1
top an-1
n n-1 n-2
1 0
top
x
an-1 a2 a1
x 进栈后
a2 a1
x 进栈前
4、进栈
A进 B进 B出 A出 C进 C出
A进 B进 B出 C进 C出 A出 A进 B进 C进 C出 B出 A出 不可能产生输出序列CAB
BAC
BCA CBA
如果是4个元素,那么它 不可能的出栈序列有哪些?
不可能出现的出栈序列:
可能的出栈序列:
1423
3142 4132 4312
2413
3412 4231
元素。往栈中推入(PUSH)一个新元素时,变量T的值 B ,从栈中弹
出(POP)一个元素时,变量T的值 C 。设栈空时,有输入序列a,b,c, 经过PUSH,POP,PUSH,PUSH,POP操作后,从栈中弹出的元素序列
是 D ,变量T的值是 E 。
A:1)先进先出 2)后进先出 3)进优于出 4)出优于进 5)随机进出
顺序栈的类型定义只需将顺序表的类型定义 中的长度属性改为top即可。顺序栈的类型 定义如下: # define StackSize 100 typedef struct { ElemType data[StackSize]; int top; }SeqStack;
栈顶top 的值为下一个将要进栈的元素下标。
B、C:1)加1 2)减1 3)不变 4)清0 5)加2 6)减2 D:1)a,b E:1)n+1 2)b,c 3)c,a 4)b,a 5)c,b 6)a,c 4)n-1 5)n-2 2)n+2 3)n
栈的特性
1. 栈属于加了限制条件的线性结构; 2. 栈是后进先出的线性表; 3. 进栈和出栈只能从栈的一个端点进行;