第3章栈与队列习题参考答案
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;
参考答案 :
// 借助一个顺序栈将已知一个数组中的数据元素逆置
public reverse(Object [] a) throws Exception {
SqStack S=new SqStack(a.length); //
构造一个容量为 a.length 的顺序栈
for(int i=0;i<a.length;i++)
,试编写相
private Node rear;//
循环链队列的尾指针
……
}
为此类编写的队列置空、队列判空、入队和出队操作的方法分别如下:
// 队列置空操作方法 public void clear() {
// 将一个已经存在的带头结点的循环链队列置成空队列 rear.setNext(rear);
++num; //
计数器加 1
}
}
// 出队操作方法
public Object poll() {
// 移除队首元素并作为此函数的值返回该对象,如果此队列为空,则返回
null
if (num==0)// 队列为空
return null;
else {
Object t = queueElem[front];//
else x=stackElem[++top1];
return x;
}
} // DuSqStack 类结束
4. 循环顺序队列类采用设置一个计数器的方法来区分循环队列的判空和判满。
和出队操作的函数。
参考答案 :
// 循环顺序队列存储结构类描述如下 : class CircleSqQueue_num {
}
return true;
}
3. 假设以一个数组实现 两个栈:一个栈以数组的第一个存储单元作为栈底,另一个栈以数组的最后一个存储单
元作为栈底 , 这种栈称为顺序双向栈。 试编写一个顺序双向栈类 DuSqStack,类中要求编写 3 个方法。 一个是
构造方法 DuDuSqStack(int maxSize), 此方法实现构造一个容量为 maxSize 的顺序双向空栈;一个是实现入
5.在顺序栈中,若栈顶指针 top 指向栈顶元素的下一个存储单元,且顺序栈的最大容量是 判满的条件是( C )。
maxSize。则顺序栈的
A . top==0 B.top==-1 C. top==maxSize D.top==maxSize-1 6.在队列中存取数据元素的原则是( A )。
A.先进先出
。
10. 无论是顺序栈还是顺序队列, 插入元素时必须先进行 栈或队列是否为满的 判断,删除元素时必须先进行 栈
或队列是否为空的 判断;而链栈或链队列中,插入元素无需进行栈或队列是否为满的判断,只要在删除元
素时先进行 栈或队列是否为空的 判断。
三、算法设计题
1. 编写一个函数,要求借助一个栈把一个数组中的数据元素逆置。
栈尾指针 , 指示第 1 号的栈底ቤተ መጻሕፍቲ ባይዱ素
// 构造方法 public DuSqStack(int maxSize) {
// 初始化栈 , 即构造一个双向空栈 stackElem = new Object[maxSize];// top0=base0=0; top1=base1=maxSize-1; }
maxSize ,则队
列的长度是( C )。
A. rear-front
B. rear-front+1
C. (rear-front+maxSize)%maxSize D. (rear-front+1)%maxSize
10. 设长度为 n 的链队列采用单循环链表加以表示,若只设一个头指针指向队首元素,则入队操作的时间复杂度
B. front!=rear D. front==(rear+1)% maxSize
8.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,
front 和 rear 分别为队首
和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为
maxSize ,则队
队尾 ,允许删除的一端称为 队首 。队列具有
7. 由于队列的删除和插入操作分别在队首和队尾进行,因此,在
链式 存储结构描述中分别需要设置两个指针分
别指向 队首结点 和 队尾结点 ,这两个指针又分别称为 队首指针 和 队尾指针 。
8. 循环顺序队列是将顺序队列的存储区域看成是一个首尾相连的环,
首尾相连的状态是通过数学上的 求模(或
栈操作的方法 push(Object X,int i),
此方法完成将数据元素 X 压入到第 i(i=0 或 1) 号栈中的操作;一个是
实现出栈操作的方法 pop( int i), 此方法完成将第 i 号栈的栈顶元素出栈的操作。 参考答案 :
class DuSqStack{
private Object[] stackElem; //
为( B )。 A .O(1)
B. O(n)
C. O(log 2n)
2
D .O(n )
二、填空题
1. 栈是一种操作受限的特殊线性表,其特殊性体现在其插入和删除操作都限制在
表尾 进行。允许插入和删除
操作的一端称为 栈顶 ,而另一端称为 栈底 。栈具有 后进先出 的特点。
2. 栈也有两种存储结构,一种是 顺序存储 ,另一种是 链式存储 ;以这两种存储结构存储的栈分别称为
顺序
栈 和 链栈 。 3. 在顺序栈中,假设栈顶指针
top 是指向栈顶元素的下一个存储单元,则
顺序栈判空的条件是 top==0 ; 栈顶
元素的访问形式是 stackElem[top-1] ;
4. 在不带表头结点的链栈中,若栈顶指针
top 直接指向栈顶元素,则将一个新结点
语句为 p.setNext(top) ; top=p; 。
p 入栈时修改链的两个对应
5. 在不带表头结点的链栈中,若栈顶指针
top 直接指向栈顶元素,则栈顶元素出栈时的修改链的对应语句为
top=top.getNext();
。
6. 队列也是一种操作受限的线性表,它与栈不同的是,队列中所有的插入操作均限制在表的一端进行,而所有
的删除操作都限制在表的另一端进行,允许插入的一端称为 先进先出 的特点。
if (num==queueElem.length)//
队列满
throw new Exception("
队列已满 ");// 输出异常
else {//
队列未满
queueElem[rear] = x;// x
加入队尾
rear=(rear + 1) % queueElem.length; //
更改队尾的位置
B.
先进后出
C. 后进后出
D.
没有限制
7.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,
front 和 rear 分别为队首
和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为
maxSize ,则队
列的判空条件是( A )。
A. front==rear C. front==rear+1
试分别编写顺序循环队列中入队
0 , 初值为 0
……
} // CircleSqQueue_num 类结束
为类 CircleSqQueue_num 所编写的入队和出队操作方法如下:
// 入队操作方法
public void offer(Object x) throws Exception {//
把指定的元素 x 插入队列
private Object[] queueElem; //
队列存储空间
private int front;
// 队首的引用,若队列不空,指向队首元素,初值为
private int rear;
// 队尾的引用,若队列不空,指向队尾元素的下一个位置
private int num;
// 计数器用来记录队列中的数据元素个数
取出队首元素
front = (front + 1) % queueElem.length;// --num; // 计数器减 1
更改队首的位置
return t;//
返回队首元素
}
}
5. 假设采用带头结点的循环链表来表示队列,并且只设一个指向队尾元素的指针(不设队首指针) 应的队列置空、队列判空、入队和出队操作的函数。 参考答案 : 用队尾指针标识的循环链队列的类描述如下 : class CircleLinkQueue {
列的判满条件是( D )。
A. front==rear
B. front!=rear
C. front==rear+1
D. front==(rear+1)% maxSize
9. 在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,