第3章 栈与队列习题参考答案

习题三参考答案

备注: 红色字体标明的是与书本内容有改动的内容。

一、选择题

1.在栈中存取数据的原则是( B )。

A.先进先出 B. 先进后出

C. 后进后出

D. 没有限制

2.若将整数1、2、3、4依次进栈,则不可能得到的出栈序列是( D )。

A.1234 B. 1324 C. 4321 D. 1423

3.在链栈中,进行出栈操作时(B )。

A.需要判断栈是否满 B. 需要判断栈是否为空

C. 需要判断栈元素的类型

D. 无需对栈作任何差别

4.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize,则顺序栈的判空条件是( A )。

A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-1

5.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize。则顺序栈的判满的条件是( C )。

A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-1

6.在队列中存取数据元素的原则是( A )。

A.先进先出 B. 先进后出

C. 后进后出

D. 没有限制

7.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判空条件是(A )。

A.front==rear B. front!=rear

C. front==rear+1

D. front==(rear+1)% maxSize

8.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判满条件是(D )。

A.front==rear B. front!=rear

C. front==rear+1

D. front==(rear+1)% maxSize

9.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首

和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的长度是(C )。

A.rear-front B. rear-front+1

C. (rear-front+maxSize)%maxSize

D. (rear-front+1)%maxSize

10.设长度为n的链队列采用单循环链表加以表示,若只设一个头指针指向队首元素,则入队操作的时间复杂度

为( B )。

A.O(1) B.O(n) C.O(log2n) D.O(n2)

二、填空题

1.栈是一种操作受限的特殊线性表,其特殊性体现在其插入和删除操作都限制在表尾进行。允许插入和删除

操作的一端称为栈顶,而另一端称为栈底。栈具有后进先出的特点。

2.栈也有两种存储结构,一种是顺序存储,另一种是链式存储;以这两种存储结构存储的栈分别称为顺序

栈和链栈。

3.在顺序栈中,假设栈顶指针top是指向栈顶元素的下一个存储单元,则顺序栈判空的条件是 top==0 ; 栈顶

元素的访问形式是 stackElem[top-1] ;

4.在不带表头结点的链栈中,若栈顶指针top直接指向栈顶元素,则将一个新结点p入栈时修改链的两个对应

语句为 p.setNext(top) ; top=p; 。

5.在不带表头结点的链栈中,若栈顶指针top直接指向栈顶元素,则栈顶元素出栈时的修改链的对应语句为

top=top.getNext(); 。

6.队列也是一种操作受限的线性表,它与栈不同的是,队列中所有的插入操作均限制在表的一端进行,而所有

的删除操作都限制在表的另一端进行,允许插入的一端称为队尾,允许删除的一端称为队首。队列具有先进先出的特点。

7.由于队列的删除和插入操作分别在队首和队尾进行,因此,在链式存储结构描述中分别需要设置两个指针分

别指向队首结点和队尾结点,这两个指针又分别称为

队首指针和队尾指针。

8.循环顺序队列是将顺序队列的存储区域看成是一个首尾相连的环,首尾相连的状态是通过数学上的求模(或

取余)运算来实现的。

9.在循环顺序队列中,若规定当front==rear时,循环队列为空;当front==(rear+1)%maxSize时,循环队列

为满,则入队操作时的队尾指针变化的相应语句是 rear=(rear+1)% maxSize ;出队操作时的队首指针变化的相应语句是 front=(front+1)%maxSize 。

10.无论是顺序栈还是顺序队列,插入元素时必须先进行栈或队列是否为满的判断,删除元素时必须先进行栈

或队列是否为空的判断;而链栈或链队列中,插入元素无需进行栈或队列是否为满的判断,只要在删除元素时先进行栈或队列是否为空的判断。

三、算法设计题

1.编写一个函数,要求借助一个栈把一个数组中的数据元素逆置。

参考答案:

//借助一个顺序栈将已知一个数组中的数据元素逆置

public reverse(Object [] a) throws Exception {

SqStack S=new SqStack(a.length); //构造一个容量为a.length的顺序栈

for(int i=0;i

S.push(a[i]);

for( int i=0;i

a[i]=S.pop();

}

2.编写一个函数判断一个字符序列是否为回文序列,所谓回文序列就是正读与反读都相同的字符序列,例如:

abba和abdba均是回文序列。要求只使用栈来实现。

参考答案:

//判断字符序列是否为回文序列,若是则返回true值,否则返回false。

public boolean isPalindSeq(String str) {

LinkStack S = new LinkStack();

int i = 0;

for (; i < str.length(); i++)

S.push(str.charAt(i));

for (i = 0; i < str.length(); i++) {

char c = ((Character) S.pop()).charValue();

if (c != str.charAt(i))

return false;

}

return true;

}

3.假设以一个数组实现两个栈:一个栈以数组的第一个存储单元作为栈底,另一个栈以数组的最后一个存储单

元作为栈底,这种栈称为顺序双向栈。试编写一个顺序双向栈类DuSqStack,类中要求编写3个方法。一个是构造方法DuDuSqStack(int maxSize),此方法实现构造一个容量为maxSize的顺序双向空栈;一个是实现入栈操作的方法push(Object X,int i),此方法完成将数据元素X压入到第i(i=0或1)号栈中的操作;一个是实现出栈操作的方法pop(int i),此方法完成将第i号栈的栈顶元素出栈的操作。

参考答案:

class DuSqStack{

private Object[] stackElem; // 栈存储空间

private int top0; //栈顶指针,指示第0号的栈顶元素的下一个位置

private int top1; //栈顶指针,指示第1号的栈顶元素的下一个位置

private int base0;//栈尾指针,指示第0号的栈底元素

private int base1;//栈尾指针,指示第1号的栈底元素

//构造方法

public DuSqStack(int maxSize) {

// 初始化栈,即构造一个双向空栈

stackElem = new Object[maxSize];// 为栈分配maxSize个存储单元

top0=base0=0;

top1=base1=maxSize-1;

}

//入栈操作方法

public void push(Object X, int i) throws Exception {

// 将数据元素X压入到第i(i的值为0或1)号栈中

if (top0 > top1) //栈满

throw new Exception("栈已满");// 抛出异常

else if (i==0)

stackElem[top0++]=X;

else if (i==1)

stackElem[top1--]=X;

}

//出栈操作方法

public Object pop(int i) throws Exception {

// 将S中第i号栈的栈顶元素出栈,并返回栈顶元素值

Object x=null;

if(i==0)

if (top0==base0)

throw new Exception("第0号栈为空");

else

x=stackElem[--top0];

else if (i==1)

if (top1==base1)

throw new Exception("第0号栈为空");

else

x=stackElem[++top1];

return x;

}

} // DuSqStack类结束

4.循环顺序队列类采用设置一个计数器的方法来区分循环队列的判空和判满。试分别编写顺序循环队列中入队

和出队操作的函数。

参考答案:

//循环顺序队列存储结构类描述如下:

class CircleSqQueue_num {

private Object[] queueElem; // 队列存储空间

private int front;// 队首的引用,若队列不空,指向队首元素,初值为0

private int rear;// 队尾的引用,若队列不空,指向队尾元素的下一个位置,初值为0

private int num; // 计数器用来记录队列中的数据元素个数

……

} // CircleSqQueue_num类结束

为类CircleSqQueue_num所编写的入队和出队操作方法如下:

// 入队操作方法

public void offer(Object x) throws Exception {//把指定的元素x插入队列

if (num==queueElem.length)// 队列满

throw new Exception("队列已满");// 输出异常

else {// 队列未满

queueElem[rear] = x;// x加入队尾

rear=(rear + 1) % queueElem.length; //更改队尾的位置

++num; //计数器加1

}

}

// 出队操作方法

public Object poll() {

//移除队首元素并作为此函数的值返回该对象,如果此队列为空,则返回 null

if (num==0)// 队列为空

return null;

else {

Object t = queueElem[front];// 取出队首元素

front = (front + 1) % queueElem.length;// 更改队首的位置

--num; //计数器减1

return t;// 返回队首元素

}

}

5.假设采用带头结点的循环链表来表示队列,并且只设一个指向队尾元素的指针(不设队首指针),试编写相

应的队列置空、队列判空、入队和出队操作的函数。

参考答案:

用队尾指针标识的循环链队列的类描述如下:

class CircleLinkQueue {

private Node rear;// 循环链队列的尾指针

……

}

为此类编写的队列置空、队列判空、入队和出队操作的方法分别如下:

// 队列置空操作方法

public void clear() {

//将一个已经存在的带头结点的循环链队列置成空队列

rear.setNext(rear);

}

// 入队操作方法

public void offer ( Object x) throws Exception {

//将指定的元素x插入到带头结点的循环链队列中

Node p= new Node(x); // 生成新结点

p.setNext(rear.getNext());// 插入链列列的尾部

rear.setNext(p);

rear=p;

}

// 出队操作方法

public void poll() throws Exception {

// 移除带头结点的循环链队列中的队首元素并作为此函数的值返回该对象,如果此队列为空,则返回 null Node p = rear.getNext().getNext();// p指向待删除的队首结点

if (p==rear)

rear.setNext(rear); //删除队首结点后,链队列变成了空链队列 else

rear.getNext().setNext(p.getNext());// 删除队首结点

}

数据结构练习题第三章栈、队列和数组习题与答案

第三章栈、队列和数组 一、名词解释: 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.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。 Int Pop(SqStackTp *sq,DataType *x) {if(sp->top==0){error(“下溢”);return(0);} else{*x=________________; ________________; return(1);} } 10. 以下运算实现在顺序栈上判栈空,请在________________处用适当句子予以填充。 Int EmptyStack(SqStackTp *sq) {if(________________) return(1); else return(0); } 11.以下运算实现在顺序栈上取栈顶元素,请在________________处用适当句子予以填充。 Int GetTop(SqStackTp *sq,DataType *x)

栈和队列练习题答案

第3章栈和队列练习题答案 一、填空题 1. 线性表、栈和队列都是线性结构,可以在线性表的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。 2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。不允许插入和删除运算的一端称为栈底。 3. 队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。 二、判断正误 (√)1. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。(√)2. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。 (×)3. 栈和队列是一种非线性数据结构。 错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。 (√)4. 栈和队列的存储方式既可是顺序方式,也可是链接方式。 (√)5. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。 (×)6. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。 错,后半句不对。 (×)7. 一个栈的输入序列是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。 (若不要求顺序出栈,则输出序列不确定) (D)3.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为 (A)r-f; (B)(n+f-r)% n; (C)n+r-f; (D)(n+r-f)% n E:①1 ②2 ③3 ④0 四、阅读理解 1.【严题集3.3②】写出下列程序段的输出结果(栈的元素类型SElem Type为char)。 void main( ){ Stack S; Char x,y; InitStack(S); x=’c’;y=’k’;

《数据结构》习题汇编03 第三章 栈和队列 试题(答案)

第三章栈和队列 一、单项选择题 参考答案: 1. A 2. B 3. C 4. A 5. B 6. B 7. D 8. D 9. C 10. A 11. D 12. A 13. A 14. D 15. C 二、填空题 参考答案: 1. 先进后出 2. 先进先出 3. 队尾,队头 4. 栈顶指针 5. 栈顶指针 6. MaxSize-1 7. top==0 8. 空栈 9. 栈顶指针10. p->link=top,top=p 11. top=top->link 12. Q.front==Q.rear 13. (Q.rear+1)%MaxSize==Q.front 14. 队尾指针15. 空,只含有一个结点 16. front == rear && front != NULL或者front == rear && rear != NULL 17. 两端18. 3x2+*5- 19. 15 20. 3 三、判断题 参考答案: 1. 是 2. 是 3. 否 4. 是 5. 是 6. 否 7. 否 8. 是 9. 否10. 否 11. 否12. 是13. 否14. 是15. 否 16. 否 四、运算题 参考答案: 1.根据以上规则,给出计算中缀表达式a + b * c – d / e时两个栈的变化。 步扫描项项类型动作OPND栈OPTR栈 0 OPTR栈与OPND栈初始化, ‘#’ 进OPTR栈, # 取第一个符号 1 a 操作数a进OPND栈, 取下一符号 a # 2 + 操作符icp (‘+’ ) > isp (‘#’ ), 进OPTR栈, 取 a # + 下一符号 3 b 操作数b进OPND栈, 取下一符号 a b # + a b # + * 4 * 操作符icp (‘*’ ) > isp (‘+’ ), 进OPTR栈, 取 下一符号 5 c 操作数c进OPND栈, 取下一符号 a b c # + * a s1# + 6 - 操作符icp (‘-’ ) < isp (‘*’ ), 退OPND栈‘c’, 退OPND 栈‘b’, 退OPTR栈‘*’, 计算 b * c→ s1, 结果 进OPND栈 s2# 7 同上同上ic p (‘-’ ) < isp (‘+’ ), 退OPND栈‘s ’, 1 退OPND 栈‘a’, 退OPTR栈‘+’, 计算 a * s1→ s2, 结果 进OPND栈

数据结构习题第三章栈和队列答案

第三章栈和队列 一、选择题 二、判断题 部份答案解释如下。 1、尾递归的消除就不需用栈 2、这个数是前序序列为1,2,3,…,n,所能取得的不相似的二叉树的数量。 三、填空题 1、操作受限(或限定仅在表尾进行插入和删除操作)后进先出 2、栈 3、3 1 2 4、23 100CH 5、0 n+1 top[1]+1=top[2] 六、两栈顶指针值相减的绝对值为1(或两栈顶指针相邻)。 7、(1)满(2)空(3)n (4)栈底(5)两栈顶指针相邻(即值之差的绝对值为1) 八、链式存储结构九、S×SS×S××10、data[++top]=x; 1一、(注:表达式中的点(.)表示将数隔开,如是三个数) 1二、假溢出时大量移动数据元素。 13、(M+1) MOD N (M+1)% N;14、队列1五、先进先出1 六、先进先出 17、s=(LinkedList)malloc(sizeof(LNode));s->data=x;s->next=r->next;

r->next=s;r=s; 1八、捐躯一个存储单元设标记 1九、(TAIL+1)MOD M=FRONT (数组下标0到M-1,若必然利用1到M,则取模为0者,值改取M 20、=+1)%(M+1);return);+1)%(M+1)==; 2一、栈2二、(rear-front+m)% m;23、(R-P+N)% N; 24、(1)a[i]或a[1] (2)a[i] (3)pop(s)或s[1]; 2五、(1)PUSH(OPTR,w)(2)POP(OPTR)(3)PUSH(OPND,operate (a,theta,b)) 26、(1)T>0(2)i0(4)top

最新第3章 栈与队列习题参考答案02464

习题三参考答案 备注: 红色字体标明的是与书本内容有改动的内容。 一、选择题 1.在栈中存取数据的原则是( B )。 A.先进先出 B. 先进后出 C. 后进后出 D. 没有限制 2.若将整数1、2、3、4依次进栈,则不可能得到的出栈序列是( D )。 A.1234 B. 1324 C. 4321 D. 1423 3.在链栈中,进行出栈操作时(B )。 A.需要判断栈是否满 B. 需要判断栈是否为空 C. 需要判断栈元素的类型 D. 无需对栈作任何差别 4.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize,则顺序栈的判空条件是( A )。 A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-1 5.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize。则顺序栈的判满的条件是( C )。 A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-1 6.在队列中存取数据元素的原则是( A )。 A.先进先出 B. 先进后出 C. 后进后出 D. 没有限制 7.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front 和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判空条件是(A )。 A.front==rear B. front!=rear C. front==rear+1 D. front==(rear+1)% maxSize 8.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front 和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判满条件是(D )。 A.front==rear B. front!=rear C. front==rear+1 D. front==(rear+1)% maxSize 9.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front 和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的长度是(C )。 A.rear-front B. rear-front+1 C. (rear-front+maxSize)%maxSize D. (rear-front+1)%maxSize 10.设长度为n的链队列采用单循环链表加以表示,若只设一个头指针指向队首元素,则入 队操作的时间复杂度为( B )。 A.O(1) B.O(n) C.O(log2n) D.O(n2) 二、填空题 1.栈是一种操作受限的特殊线性表,其特殊性体现在其插入和删除操作都限制在表尾进

栈和队列习题及答案

栈和队列习题及答案 【篇一:栈和队列练习题答案】 xt>一、填空题 1. 线性表、栈和队列都是结构,可以在线性表的在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。 2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为。不允许插入和删除运算的一端称为栈底。 3. 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。 二、判断正误 (√)1. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。(√)2. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。 错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。 (√)4. 栈和队列的存储方式既可是顺序方式,也可是链接方式。(√)5. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底 分别设在这片内存空间的两端。 错,有可能。 三、单项选择题 (b)1.栈中元素的进出原则是 A.先进先出B.后进先出C.栈空则进D.栈满则出 (c)2.若已知一个栈的入栈序列是1,2,3,?,n,其输出序列为p1,p2,p3,?,pn,若p1=n,则pi为 A.i B.n-iC.n-i+1 D.不确定 解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,?,n,则出栈的序列是n,?,3,2,1。 (若不要求顺序出栈,则输出序列不确定) (d)3.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的

栈和队列习题及答案

栈和队列习题及答案 栈和队列习题及答案 【篇一:栈和队列练习题答案】 xt>一、填空题 1. 线性表、栈和队列都是结构,可以在线性表的在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。 2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为。不允许插入和删除运算的一端称为栈底。 3. 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。 二、判断正误 (√)1. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。(√)2. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。 错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。 (√)4. 栈和队列的存储方式既可是顺序方式,也可是链接方式。(√)5. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底 分别设在这片内存空间的两端。 错,有可能。 三、单项选择题 (b)1.栈中元素的进出原则是 A.先进先出B.后进先出C.栈空则进D.栈满则出 (c)2.若已知一个栈的入栈序列是1,2,3,?,n,其输出序列为p1,p2,p3,?,pn,若p1=n,则pi为 A.i B.n-iC.n-i+1 D.不确定

解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,?,n,则出栈的序列是n,?,3,2,1。 (若不要求顺序出栈,则输出序列不确定) (d)3.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的 位置,假定队列中元素的个数小于n,计算队列中元素的公式为(A)r-f; (B)(n+f-r)% n; (C)n+r-f;(D)(n+r -f)% n e:①1 ②2 ③ 3 ④ 0 四、阅读理解 1. 【严题集3.3②】写出下列程序段的输出结果(栈的元素类型selem type为char)。 void main( ){ stack s; char x,y; initstack(s); x=’c’;y=’k’; push(s,x); push(s,’a’); push(s,y); pop(s,x); push(s,’t’); push(s,x); pop(s,x); push(s,’s’); while(!stackempty(s)){ pop(s,y);printf(y); }; printf(x); } 答:输出为“stack”。 2. 【严题集 3.12②】写出下列程序段的输出结果(队列中的元素类型qelem type为char)。 void main( ){ queue q; init queue (q); char x=’e’; y=’c’; enqueue (q,’h’); enqueue (q,’r’); enqueue (q, y); dequeue (q,x); enqueue (q,x);

数据结构(栈和队列)习题与答案

一、单选题 1、元素A、B、C、D依次进栈后,栈顶元素是 _______。 A.B B.D C.C D.A 正确答案:B 2、经过以下运算后, x的值是 _______。 InitStack (s); Push(s, a); Push(s, b); Pop(s, x); GetTop(s,x) A.0 B.b C.a D.1 正确答案:C 3、经过以下栈运算后,StackEmpty(s)的值是 _______。 InitStack (s); Push(s, a); Push(s, b); Pop(s, x); Pop(s,y) A.0 B.b C.a D.1 正确答案:D 4、已知一个栈的进栈序列是ABC,出栈序列为CBA,经过栈的操作是 _______。 A.push, push, push, pop, pop, pop B.push,pop,push, push,pop, pop C.push, push,pop, pop,push,pop D.push,pop,push,pop,push,pop 正确答案:A

5、若元素a、b、c、d、e、f依次进栈,允许进栈、退栈的操作交替进行,但不允许 连续3次退栈工作,则不可能得到的出栈序列是 _______。 A. bcaefd B.afedcb C.cbdaef D.dcebfa 正确答案:B 6、设一个栈的输入序列为A、B、C、D,则借助一个栈所得的输出序列不可能是 _______。 A.DCBA B.DABC C.ACDB D.ABCD 正确答案:B 7、一个栈的进栈序列是abcde,则栈的不可能的输出序列是 _______。 A.decba B.abcde C.dceab D.edcba 正确答案:C 8、已知一个栈的进栈序列是1,2,3,…n,其输出序列的第一个元素是i(1≤i≤n),则第j(1≤j≤n)个出栈元素是_______。 A.n-i B.j-i+1 C.i D.不确定 正确答案:D

第3章栈和队列习题参考答案

第3章栈和队列习题参考答案 第3章栈和队列 一、基础知识题 3.1有五个数依次进栈:1,2,3,4,5。在各种出栈的序列中,以3,4先出的 序列有哪几个。(3在4之前出栈)。 【解答】34215 ,34251,34521 3.2铁路进行列车调度时,常把站台设计成栈式结构,若进站的六辆列车顺序为: 1,2,3,4,5,6,那么是否能够得到435612,325641,154623和135426的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。 【解答】输入序列为123456,不能得出435612和154623。不能得到435612的理由是,输出序列最后两元素是12,前面4个元素(4356)得到后,栈中元素剩12,且2在栈顶,不可能让栈底元素1在栈顶元素2之前出栈。不能得到154623的理由类似,当栈中元素只剩23,且3在栈顶,2不可能先于3出栈。 得到325641的过程如下:1 2 3顺序入栈,32出栈,得到部分输出序列32;然后45入栈,5出栈,部分输出序列变为325;接着6入栈并退栈,部分输出序列变为3256;最后41退栈,得最终结果325641。 得到135426的过程如下:1入栈并出栈,得到部分输出序列1;然后2和3入栈,3出栈,部分输出序列变为13;接着4和5入栈,5,4和2依次出栈,部分输出序列变为13542;最后6入栈并退栈,得最终结果135426。 3.3若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别 为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?

数据结构第三章堆栈和队列测试题及答案

堆栈和队列测试题 一、选择题 1. 对于栈操作数据的原则是(B)。 A. 先进先出 B. 后进先出 C. 后进后出 D. 不分顺序 2. 在做进栈运算时,应先判别栈是否( B),在做退栈运算时应先判别栈是否( A)。当栈中元素为n个,做进栈运算时发生上溢,则说明该栈的最大容量为( B )。为 了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空 间时,应将两栈的( D )分别设在这片内存空间的两端。 ①, ②: A. 空 B. 满 C. 上溢 D. 下溢 ③: A. n-1 B. n C. n+1 D.n/2 ④: A. 长度 B. 深度 C. 栈顶 D. 栈底 3. 一个栈的输入序列依次为1,2,3,…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是(B)。 A. 不确定 B. n-i+1 C. i D. n-i 4. 若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j个输出 元素是( D )。 A. i-j-1 B. i-j C. j-i+1 D. 不确定的 5. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,p N,若p N是n,则pi是( D )。 A. i B. n-i C. n-i+1 D. 不确定 6.有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?( C ) A. 5 4 3 6 1 2 B. 4 5 3 1 2 6 C. 3 4 6 5 2 1 D. 2 3 4 1 5 6 7. 设栈的输入序列是1,2,3,4,则( D )不可能是其出栈序列。 A. 1,2,4,3, B. 2,1,3,4, C. 1,4,3,2, D. 4,3,1,2, E. 3,2,1,4, 8. 一个栈的输入序列为1 2 3 4 5,则下列序列中不可能是栈的输出序列的是 ( B )。 A. 2 3 4 1 5 B. 5 4 1 3 2 C. 2 3 1 4 5 D. 1 5 4 3 2 9. 设一个栈的输入序列是1,2,3,4,5,则下列序列中,是栈的合法输出序列的是(D)。 A. 5 1 2 3 4 B. 4 5 1 3 2 C. 4 3 1 2 5 D. 3 2 1 5 4

数据结构第三章栈和队列习题

03 栈和队列 【单选题】 1. 设入栈先后顺序为a,b,c,且在入栈过程中可出栈,则不可能得到的出栈序列是(B)。A、a,b,c B、c,a,b C、b,c,a D、b,a,c 2. 栈是一种(B)的线性表。 A、先进先出B、后进先出C、随意进出 3. 在一个可存放n个数据元素的顺序栈中,假设以高地址端为栈底,以top为栈顶指针,当向栈中压入一个数据元素时,top的变化是(D)。 A、不变B、top=n C、top++ D、top-- 4. 设在一不带头结点的链队列中,front和rear分别为其队头和队尾指针,则删除一个结点的操作是(C)。 A、rear=front.next B、rear=rear.next C、front=front.next D、front=rear.next 5. 向一个栈顶指针为s且带头结点的链栈中插入一个p所指结点时,应执行(B)。A、s.next=p; B、p.next=s.next; s.next=p C、p.next=s; s=p; D、p.next=s; s=s.next; 6. 从一个栈顶指针为s且不带头结点的链栈中删除一个结点,用x保存被删结点的值,则执行(D)。 A、x=s; s=s.next; B、x=s.data; C、s=s.next; x=s.data; D、x=s.data; s=s.next; 7. 设在一不带头结点的链队列中,front和rear分别为其队头和队尾指针,则插入p所指结点的操作是(B)。 A、front.next=p; front=p; B、rear.next=p; rear=p; C、p.next=rear; rear=p; D、p.next=front; front=p; 8. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若 p1=n,则pi为(C)。A、i B、n-i C、n-i+1 D、不确定 【计算题】 1. 设入栈序列a、b、c、d,且在入栈的过程中允许出栈,试写出所有不可能得到的出栈序列。参考答案: dabc、dacb、dbac、dbca、dcab、cadb、cabd、cdab、bdac、adbc。

数据结构栈和队列习题及答案

习题三栈和队列 一单项选择题 1. 在作进栈运算时,应先判别栈是否(① ),在作退栈运算时应先判别栈是否(② )。当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③ )。 ①, ②: A. 空 B. 满 C. 上溢 D. 下溢 ③: A. n-1 B. n C. n+1 D. n/2 2.若已知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,...,pn,若p1=3,则p2为( )。 A 可能是2 B 一定是2 C 可能是1 D 一定是1 3. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?() A. 5 4 3 6 1 2 B. 4 5 3 1 2 6 C. 3 4 6 5 2 1 D. 2 3 4 1 5 6 4.设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4, s6, s5,s1,则栈的容量至少应该是() A.2 B. 3 C. 5 D.6 5. 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。 A. |top[2]-top[1]|=0 B. top[1]+1=top[2] C. top[1]+top[2]=m D. top[1]=top[2] 6. 执行完下列语句段后,i值为:() int f(int x) { return ((x>0) ? x* f(x-1):2);} int i ; i =f(f(1)); A.2 B. 4 C. 8 D. 无限递归 7. 表达式3* 2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为(),其中^为乘幂。 A. 3,2,4,1,1;(*^(+*- B. 3,2,8;(*^- C. 3,2,4,2,2;(*^(- D. 3,2,8;(*^(- 8. 用链接方式存储的队列,在进行删除运算时()。 A. 仅修改头指针 B. 仅修改尾指针 C. 头、尾指针都要修改 D. 头、尾指针可能都要修改 9. 递归过程或函数调用时,处理参数及返回地址,要用一种称为()的数据结构。 A.队列 B.多维数组 C.栈 D. 线性表 10.设C语言数组Data[m+1]作为循环队列SQ的存储空间, front为队头指针,rear为队尾指针,则执行出队操作的语句为() A.front=front+1 B. front=(front+1)% m C.rear=(rear+1)%(m+1) D. front=(front+1)%(m+1) 11.循环队列的队满条件为 ( ) A. (sq.rear+1) % maxsize ==(sq.front+1) % maxsize; B. (sq.front+1) % maxsize ==sq.rear C. (sq.rear+1) % maxsize ==sq.front D.sq.rear ==sq.front

第三章栈和队列习题答案

第三章栈和队列习题答案 一、基础知识题 3.1 设将整数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 种排列中,哪些序列是可以通过相应的入出栈操作得到的。 答:(1)出栈序列为:1324 (2) 不能得到1423 序列。因为要得到14 的出栈序列,则应做 Push(1),Pop(),Push(2),Push (3),Push(4),Pop()o这样,3在栈顶,2在栈底,所以不能得到23的出栈序列。能得到1432 的出栈序列。具体操作为:Push(1), Pop(),Push(2),Push(3),Push(4),Pop(),Pop(),Pop() (3) 在1,2 ,3 ,4 的24 种排列中,可通过相应入出栈操作得到的序列是: 1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3214,3241,3421,4321 不能得到的序列是: 1423,2413,3124,3142,3412,4123,4132,4213,4231,4312 3.2 链栈中为何不设置头结点? 答:链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。 3.3 循环队列的优点是什么? 如何判别它的空和满? 答:循环队列的优点是:它可以克服顺序队列的"假上溢"现象,能够使存储队列的向量空间得到充分 的利用。判别循环队列的”空"或"满"不能以头尾指针是否相等来确定,一般是通过以下几种方法:一是另设一布尔变量来区别队列的空和满。二是少用一个元素的空间,每次入队前测试入队后头尾指针是否会重合,如果会重合就认为队列已满。三是设置一计数器记录队列中元素总数,不仅可判别空或 满,还可以得到队列中元素的个数。 3.4 设长度为n 的链队用单循环链表表示,若设头指针,则入队出队操作的时间为何? 若只设尾指针呢? 答:当只设头指针时,出队的时间为1,而入队的时间需要n,因为每次入队均需从头指针开始查找, 找到最后一个元素时方可进行入队操作。若只设尾指针,则出入队时间均为1。因为是循环链表,尾 指针所指的下一个元素就是头指针所指元素,所以出队时不需要遍历整个队列。 3.5 指出下述程序段的功能是什么? (1) void Demo1(SeqStack *S){ int i; arr[64] ; n=0 ; while ( StackEmpty(S)) arr[n++]=Pop(S); for (i=0, i< n; i++) Push(S, arr[i]); } //Demo1 (2) SeqStack S1, S2, tmp; DataType x; …〃假设栈tmp和S2已做过初始化 while ( ! StackEmpty (&S1)) {x=Pop(&S1) ; Push(&tmp,x); } while ( ! StackEmpty (&tmp) )

第三章 栈和队列习题与解析good

第四章栈和队列习题 一判断题(y/n)nyynnynnn 1做进栈运算时应先判别,栈是否为空。 2,做退栈运算时应先判别,栈是否为空。 3,当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为n. 4,为了增加内存空间的利用率和减少发生上溢的可能性,由两个栈共享一片连续的内存空间时,应将两栈的栈顶分别设在着片内存空间的两端。 5, 只有当两个基本栈的栈底在栈空间的某一位置相遇时,才产生上溢。 6, 栈是一种线性表,它的特点是后进先出。 7, 设一数列的顺序为1,2,3,4,5,6, 通过栈结构可以排成的顺序必须是3,2,5,6,4,1. 8, 设有一个空栈,栈顶指针为1000H(十六进制,下同),现有输入序列1,2,3,4,5,经过PUSH,PUSH,POP,PUSH,POP,PUSH,PUSH后,输出序列是2,1. 9, 设有一个空栈,栈顶指针为1000H(十六进制,下同),现有输入序列1,2,3,4,5,经过PUSH,PUSH,POP,PUSH,POP,PUSH,PUSH后,栈顶指针是不是1005H.

二单选题(请从下列A,B,C,D选项中选择一项) 1,栈的特点是: 先进先出 后进先出 进优于出 出优于进 2,队列的特点是: 先进先出 后进先出 进优于出 出优于进 3,栈与队列都是: 顺序存储的线性结构 链式存储的线性结构 限制存取点的线性结构 限制存取点的非线性结构 4,若进栈序列为1,2,3,4,则()不可能是一个出栈序列。 3,2,1,4 3,2,4,1 4,2,3,1 4,3,2,1 1,2,3,4 1,3,2,4 5,若进栈队列的序列为1,2,3,4,则()是一个出队列序列。 3,2,1,4 3,2,4,1 4,2,3,1 4,3,2,1 1,2,3,4 1,3,2,4 6,若一个栈的输入序列是:1,2,3,...,n,输出序列的第一个元素是n,则第i个输出元素是: 不确定 n-i

相关主题
相关文档
最新文档