第3章 栈2
数据结构-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类。
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 栈与递归¾递归函数:一个直接调用自己或通过一系列的调用语句间接地调用自己的函数。
第三章 栈
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的后缀表达式是()。
栈和队列答案
第3章栈和队列答案一、填空题1. 向量、栈和队列都是线性结构,可以在向量的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。
2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。
不允许插入和删除运算的一端称为栈底。
3. 队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
4. 在具有n个单元的循环队列中,队满时共有 n-1 个元素。
5. 带表头结点的空循环双向链表的长度等于0。
解:Array二、判断正误(×)1. 在表结构中最常用的是线性表,栈和队列不太常用。
错,不一定吧调用子程序或函数常用,CPU中也用队列。
(√)2. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
(√)3. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(×)4. 栈和链表是两种不同的数据结构。
错,栈是逻辑结构的概念,是特殊殊线性表,而链表是存储结构概念,二者不是同类项。
(×)5. 栈和队列是一种非线性数据结构。
错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(√)6. 栈和队列的存储方式既可是顺序方式,也可是链接方式。
(√)7. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。
(×)8. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。
错,后半句不对。
(×)9. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。
错,有可能。
三、单项选择题( B)1. 栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出(C)2. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为A.i B.n=i C.n-i+1 D.不确定解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,…,n,则出栈的序列是n,…,3,2,1。
数据结构第三章考试题库(含答案)
第3章栈和队列一选择题1. 对于栈操作数据的原则是()。
【青岛大学2001 五、2(2分)】A. 先进先出B. 后进先出C. 后进后出D. 不分顺序2. 在作进栈运算时,应先判别栈是否( ①),在作退栈运算时应先判别栈是否( ②)。
当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为( ③)。
为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的( ④)分别设在这片内存空间的两端,这样,当( ⑤)时,才产生上溢。
①, ②: A. 空 B. 满 C. 上溢 D. 下溢③: A. n-1 B. n C. n+1 D. n/2④: A. 长度 B. 深度 C. 栈顶 D. 栈底⑤: A. 两个栈的栈顶同时到达栈空间的中心点.B. 其中一个栈的栈顶到达栈空间的中心点.C. 两个栈的栈顶在栈空间的某一位置相遇.D. 两个栈均不空,且一个栈的栈顶到达另一个栈的栈底.【上海海运学院1997 二、1(5分)】【上海海运学院1999 二、1(5分)】3. 一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是()。
A. 不确定B. n-i+1C. iD. n-i【中山大学1999 一、9(1分)】4. 若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j个输出元素是()。
A. i-j-1B. i-jC. j-i+1D. 不确定的【武汉大学2000 二、3】5. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,p N,若p N是n,则p i是( )。
A. iB. n-iC. n-i+1D. 不确定【南京理工大学2001 一、1(1.5分)】6. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?()A. 5 4 3 6 1 2B. 4 5 3 1 2 6C. 3 4 6 5 2 1D. 2 34 15 6【北方交通大学2001 一、3(2分)】7. 设栈的输入序列是1,2,3,4,则()不可能是其出栈序列。
数据结构(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、队头尾指针都可能要修改。
第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
数据结构与算法第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)【分析】在带头指针的循环链表中,出队即是删除开始结点,这只需修改相应指针;入队即是在终端结点的后面插入一个结点,这需要从头指针开始查找终端结点的地址。
南京邮电大学数据结构A第3章
3.1 堆栈
3.1.1 堆栈抽象数据类型 3. 栈的C++模板抽象类
程序3-1 堆栈的C++类
#include <iostream.h> template <class T> class Stack { public: virtual bool IsEmpty() const=0; virtual bool IsFull() const=0; virtual bool Top(T &x) const=0; virtual bool Push(T x)=0; virtual bool Pop()=0; virtual void Clear()=0; };
3.2 队列
3.2.1 队列抽象数据类型 3. 队列的C++模板抽象类
template <class T> class Queue { public:
Queue(){};
~Queue(){}; virtual bool EnQueue(const T x)=0;
virtual bool DeQueue()=0;
出栈操作Pop() Node<T> *q = top; top = top->link; delete q;
top
an-1
an-2
an-3
…
a0
∧
图3-3 链式栈
3.2 队列
3.1.3 栈的链接表示 队列的示意图
Q=(a0,a1,…,an-1)
入队 课堂提要
第3章 堆栈和队列 3.1 堆栈 3.2 队列 3.2.1 队列抽象数据类型 3.2.2 队列的顺序表示 3.2.3 队列的链接表示 3.3 表达式的计算 3.4 递归
第三章_表、栈和队列
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
《计算机组成原理》第3章习题答案
第3章习题解答1 1..指令长度和机器字长有什么关系指令长度和机器字长有什么关系??半字长指令、单字长指令、双字长指令分别表示什么意思么意思? ?解:解:指令长度与机器字长没有固定的关系,指令长度与机器字长没有固定的关系,指令长度可以等于机器字长,指令长度可以等于机器字长,指令长度可以等于机器字长,也可以大于或也可以大于或小于机器字长。
通常,把指令长度等于机器字长的指令称为单字长指令;把指令长度等于机器字长的指令称为单字长指令;指令长度等于半个指令长度等于半个机器字长的指令称为半字长指令;指令长度等于两个机器字长的指令称为双字长指令。
机器字长的指令称为半字长指令;指令长度等于两个机器字长的指令称为双字长指令。
2 2..零地址指令的操作数来自哪里零地址指令的操作数来自哪里??一地址指令中,另一个操作数的地址通常可采用什么寻址方式获得寻址方式获得??各举一例说明。
各举一例说明。
解:解:双操作数的零地址指令的操作数来自堆栈的栈顶和次栈顶。
双操作数的一地址指令的另一个操作数通常可采用隐含寻址方式获得,即将另一操作数预先存放在累加器中。
例如,前述零地址和一地址的加法指令。
前述零地址和一地址的加法指令。
3 3.某机为定长指令字结构,.某机为定长指令字结构,.某机为定长指令字结构,指令长度指令长度16位;每个操作数的地址码长6位,指令分为无操作数、单操作数和双操作数三类。
操作数、单操作数和双操作数三类。
若双操作数指令已有若双操作数指令已有K 种,无操作数指令已有L 种,问单操作数指令最多可能有多少种单操作数指令最多可能有多少种??上述三类指令各自允许的最大指令条数是多少上述三类指令各自允许的最大指令条数是多少? ? 解:解:解:X= (2X= (24一K)×26一[L/26]双操作数指令的最大指令数:双操作数指令的最大指令数:双操作数指令的最大指令数:224一1。
单操作数指令的最大指令数:15×2单操作数指令的最大指令数:15×26一l(l(假设双操作数指令仅假设双操作数指令仅1条,为无操作数指令留出1个扩展窗口个扩展窗口))。
栈和队列习题及答案
栈和队列习题及答案第三章栈和队列⼀、选择题1、⼀个栈的输⼊序列为:a,b,c,d,e,则栈的不可能输出的序列是()。
A. a,b,c,d,eB. d,e,c,b,aC. d,c,e,a,bD. e,d,c,b,a2、判断⼀个循环队列Q(最多n个元素)为满的条件是()。
A. Q->rear==Q->frontB. Q->rear==Q->front+1C. Q->front==(Q->rear+1)%nD. Q->front==(Q->rear-1)%n3、设计⼀个判别表达式中括号是否配对的算法,采⽤()数据结构最佳。
A. 顺序表B. 链表C. 队列D. 栈4、带头结点的单链表head为空的判定条件是()。
A. head==NULLB. head->next==NULLC. head->next!=NULLD. head!=NULL5、⼀个栈的输⼊序列为:1,2,3,4,则栈的不可能输出的序列是()。
A. 1243B. 2134C. 1432D. 4312E. 32146、若⽤⼀个⼤⼩为6的数组来实现循环队列,且当rear和front的值分别为0,3。
当从队列中删除⼀个元素,再加⼊两个元素后,rear和front 的值分别为()。
A. 1和5B. 2和4C. 4和2D. 5和17、队列的插⼊操作是在()。
A. 队尾B. 队头C. 队列任意位置D. 队头元素后8、循环队列的队头和队尾指针分别为front和rear,则判断循环队列为空的条件是()。
A. front==rearB. front==0C. rear==0D. front=rear+19、⼀个顺序栈S,其栈顶指针为top,则将元素e⼊栈的操作是()。
A. *S->top=e;S->top++;B. S->top++;*S->top=e;C. *S->top=eD. S->top=e;10、表达式a*(b+c)-d的后缀表达式是()。
第3章 Thumb-2指令系统
(Hand Optimized Code / Previously Written 32-Bit ARM Assembler Files)
User/System Register File
Unified Assembler Language
ASM (UAL)
Unified Assembler Thumb(2) C/C++ Compiler
(1)16-bit指令集; (2)32-bit指令集。
2. Thumb-2指令集分类(续)
• 按功能和寻址方式分类
(1)数据传送指令 (2)Load/Store指令 (3)批量Load/Store指令 (4)算术四则运算指令 (5)逻辑操作指令 (6)移位和循环指令 (7)符号扩展指令 (8)字节调序指令REV, REVH,REV16,REVSH (9)位域处理指令 (10)子程序调用与无条件转移指令 (11)隔离(barrier)指令 (12)饱和运算指令 (13) If‐Then指令 (15)比较跳转指令等
4. Cortex-M3常用的Thumb-2指令集(续)
(2)Load/Store指令
指令
LDRB Rd, [Rn, #offset] LDRH Rd, [Rn, #offset] LDR Rd, [Rn, #offset] LDRD Rd1, Rd2, [Rn, #offset] STRB Rd, [Rn, #offset] STRH Rd, [Rn, #offset] STR Rd, [Rn, #offset] LDRD Rd1, Rd2, [Rn, #offset]
⑧ 虽然Thumb指令能够实现较高密度的代码,缓存使 用效率更高,但实现ARM指令代码的功能往往需要较多 的Thumb指令代码,相比较而言,ARM指令使用起来更 灵活。
第三章 栈和队列(续)
第三章栈和队列(续)1.队列的概念队列是限定只能在一端进队,在另一端出队的特殊线性表.从这个定义中应当理解到以下几点:队列属于加了限制条件的线性结构队列是先进先出的线性表进队只能从称为队尾(rear)的一端进行,出队只能从队的另一端,称为队头(front)的端点进行.不能从队列的中间进入或删除元素.队列中的元素个数可以为0,此时是空队列.队列中的元素的个数是可以变化的,可以是多个,但不能是无穷多个.同一个队列中的所有元素的类型相同.队列的存储方式有顺序存储方式(顺序队列)和链式存储方式(链式队列).在顺序队列中,使用一个数组存放队列的元素,并用一个队列指针(front)指向队头元素,一个队列指针(rear)指向队尾元素;在链式队列中,用一个单链表存储队列的的元素,链表的第一个节点定义为队头节点,链表的最后一个节点定义为队尾节点.顺序队列又分为循环队列和非循环队列,循环队列解决了假溢出的问题.本章只介绍顺序循环队列上的算法实现.2.顺序队顺序队列的节点的类型定义如下:#define maxlen 20typedef char elemtype;typedef struct sqqueue{elemtype data[maxlen];int front,rear;} squeue,*sq;p64类型定义:#define maxqsize 100typedef struct {qelemtype *base;int front;int rear;}sqqueue;解决了假溢出的问题,需要将数组想象为首尾相接的圆环.称这种数组为“循环数组”,存储在其中的队列称为“循环队列”。
解决队空、队满的判断问题,可以有3种方法:(1)设置一个布尔变量以区别队空还是队满。
(2)使用计数器记录元素个数,即队列长度。
(3)浪费一个元素的空间,以区别队空还是队满。
在使用中,通常采用最后一种方法。
通常约定队首指针指示队首元素,队尾指针指示队尾元素的下一个位置,因此在循环队列中: 初始时:sq->front=sq->rear=0入队:队未满时,sq->data[sq->rear]=x;sq->rear=(sq->rear+1)%maxlen出队:对非空时,sq->front=(sq->front+1)%maxlen队空条件:sq->rear==sq->front队满条件:(sq->rear+1)%maxlen=sq->front队列长度:(sq->rear+maxlen-sq->front)%maxlen顺序队列操作演示(1)设队列的大小为7,开始为空队列,front=-1,rear=-1;队空条件:front=rear(2)插入数据A,front=-1,rear=0;(3)插入数据B,C, front=-1,rear=2;(4)删除A, front=0,rear=2;(5)删除B, front=1,rear=2;(6)插入D,E,F,G, front=1,rear=6;(7)插入H. front=1,rear=7;溢出,假溢出。
第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)同优先级的遵循从左向右的结合性。
数据结构(c语言版)课后习题答案完整版
第1章 绪论5.选择题:CCBDCA6.试分析下面各程序段的时间复杂度。
.试分析下面各程序段的时间复杂度。
(1)O (1) (2)O (m*n ) (3)O (n 2) (4)O (log 3n )(5)因为x++共执行了n-1+n-2+……+1= n(n-1)/2,所以执行时间为O (n 2) (6)O(n )第2章 线性表1.选择题.选择题babadbcabdcddac 2.算法设计题.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
ElemType Max (LinkList L ){if(L->next==NULL) return NULL; pmax=L->next; //假定第一个结点中数据具有最大值假定第一个结点中数据具有最大值 p=L->next->next;while(p != NULL ){//如果下一个结点存在if(p->data > pmax->data) pmax=p; p=p->next; }return pmax->data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
的存储空间。
void inverse(LinkList &L) { // 逆置带头结点的单链表 Lp=L->next; L->next=NULL; while ( p) {q=p->next; // q 指向*p 的后继 p->next=L->next;L->next=p; // *p 插入在头结点之后 p = q; }}、空间(n)、空间(10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)的数据元素。
复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法思想: 算法思想:
初始化栈; 初始化栈; while(n>0) { 将n%r结果非空 出栈(即输出栈顶元素) 出栈(即输出栈顶元素);
作 业
3-1:将十进制正整数n转换为 进制的数。 :将十进制正整数 转换为 进制的数。 转换为r进制的数 (要求:用数组实现栈的方式完成。) 要求: 要求 用数组实现栈的方式完成。 void ntor( int n, int r) { }
【举例1】数制转换问题:将十进制正整数n转换为r 举例1 数制转换问题:将十进制正整数n转换为r 进制的数。 进制的数。
把十进制数159转换成八进制数 如: 把十进制数 转换成八进制数 8 159 8 19 8 2 0 余7 余3 余2 2 3 7
top top top top
(159)10 = (237)8
data: 存储栈元素; : 存储栈元素; next: 是指向下一个结点的指针。 : 是指向下一个结点的指针。
1、入栈 、 新元素x入栈算法的 语言描述: 入栈算法的C语言描述 新元素 入栈算法的 语言描述: Slink Push( Slink top , int x ) { Slink p; p=(Slink) malloc ( sizeof (Snode) ); p->data = x; p->next = top; top = p; return(top); }
3.3 用指针实现栈
top data next an … a2 a1 ^ 栈底
(b)空栈 )
栈顶
top
NULL
(a)非空栈 )
3.3 用指针实现栈
链栈的结点类型定义为: 链栈的结点类型定义为:
typedef struct snode { int data; struct snode *next; } Snode , *Slink;
2、出栈 、 栈顶元素出栈算法的C语言描述 语言描述: 栈顶元素出栈算法的 语言描述: Slink Pop( Slink top , int *x ) {
Slink p; if ( top!=NULL ) { *x=top->data; p=top; top=top->next; free(p); } return ( top );
3.3 链栈
为解决溢出问题, 为解决溢出问题,最好用链表作为栈的存 储结构, 用指针实现栈,称为链栈 链栈。 储结构,即用指针实现栈,称为链栈。 链栈是一种特殊的单链表,单链表的头部 链栈是一种特殊的单链表, 结点称栈顶( ),单链表的尾部结点称为 结点称栈顶(top),单链表的尾部结点称为 ), 栈底。 栈底。当top=NULL时,表示空栈,如下图所 时 表示空栈, 示:
}
课 堂 练 习
1.设依次进入一个栈的元素序列为 设依次进入一个栈的元素序列为a,b,c,d,不可得到 设依次进入一个栈的元素序列为 不可得到 出栈的元素序列有_____。 出栈的元素序列有 D 。 A. a.b,c,d B. a,d,c,b C. b,a,d,c D. c,d,a,b
3.4 栈的应用举例