问答题
下面是队列QUEUE和栈STACK的主要操作:
QUEUE:(设定每个队列元素的数据类型为Type)
bool isEmpty(QUEUE Q); //判断队列空否,true为空,false不空
bool getFront(QUEUE Q,Type&x); //通过x返回队头元素的值
void enQueue(QUEUE Q,Type x); //将新元素x插入到队列的队尾
void deQueue(Queue Q); //从队列中退出队头元素
STACK:(设定每个栈元素的数据类型与队列相同,为Type)
void initStack(STACK S); //对新创建的栈初始化,置成空栈
bool isEmpty(STACK S); //判断栈空否,true栈空,false不空
void push(STACK S,Type x); //将新元素X进栈
void pop(STACK S); //栈顶元素退栈
bool getTop(STACK S,Type&x); //通过x返回栈顶元素的值
利用以上栈和队列的操作,编写以下针对队列的函数的实现代码(要求非递归实现)。
问答题
“逆转”函数void reverse(QUEUE&Q)
【正确答案】
【答案解析】利用队列和栈实现以下算法(要求非递归实现)。
“逆转”函数。将队列中全部元素出队并放进栈里,这样所有元素排列的顺序颠倒。再把栈里的所有元素退出栈并放进队列中,所有元素的排列顺序与当初它们在队列中的排列顺序全部逆转了。
void reverse (QUEUE&Q){
STACK S;initStack (s);Type trap;
while (!isEmpty(Q)) {getFront(Q,tmp);deQueue(Q);Push(S,tmp);}
while (!isEmpty(S)) {getTop(S,tmp);Pop(S);enQueue(Q,tmp);}
}
问答题
“判等”函数bool equal(QUEUE Q1,QUEUE Q2)
【正确答案】
【答案解析】“判等”函数。本函数做判等比较,所以判断之后,原队列的内容应保持比较之前的状态,不能因判断而改变,所以函数参数表中的两个队列应是传值型参数,不应是引用型参数,Q1和Q2是实际参数的副本。算法思路是:当两个队列都非空时,做对应元素比较,一旦发现不等则立即可以断定两个队列不等并退出比较,否则继续比较。当两个队列经过这样的逐个元素比较后都变空且每一对应元素都相等,则两个队列相等;否则不等。
bool equal (QUEUE Q1,QUEUE Q2){
Type t1,t2;bool finished=true;
while (!is.Empty(Q1)&&! is.Empty(Q2)){
getFront(Q1,t1);deQueue(Q1); //从左队列退出一个元素
getFront(Q2,T2);deQueue(Q2); //从右队列退出一个元素
if(t1!=t2){finished=false;break;}
}
if(finished==false ||!isEmpty(Q1)}||!isEmpty(Q2))return false;
else return true;
}
问答题
“清空”函数void clear(QUEUE&Q);
【正确答案】
【答案解析】“清空”函数。算法思路是:当队列不空时逐个退出队列中的元素。
void clear (QUEUE&Q){
while (!isEmpty (Q))deQueue(Q);
}