【正确答案】(1)数据结构
采用栈和队列的顺序表示定义。
(2)思路
算法步骤如下。
①建立两个空栈,一个用做临时栈。
②将队列中每个元素弹出一次,同时入原队列和临时栈。此时,队列保持不变,临时栈中的元素顺序与想要创建的栈恰好相反。
③将临时栈中元素依次弹出,入非临时栈。
④释放临时栈的空间,返回非临时栈。
设队列中的元素个数为n,则上述第②、③步的时间代价均为O(n),第①、④步的时间代价均为O(1)。总时间代价为O(n)。
(3)算法
PSeqStack queueToStack(PSeqQueue paqu){ /*从队列创建栈*/
PSeqStack pastack=createEmptyStack_seq();
PSeqStack ptempstack=createEmptyStack_seq();
int lastposition;
DataType temp;
if(isEmptyQueue_seq(paqu))
return pastack;
lastposition=paqu->r;
/*lastposition存放初始队列即将要插入元素的位置,也就是最终队列中第一个元素的位置*/
while(paqu->f!=lastposition){
temp=frontQueue_seq(paqu);
deQueue_seq(paqu); /*将每个元素出队列*/
enQueue_seq(paqu,temp); /*入队列*/
push_seq(ptempstack,temp); /*入临时栈*/
}
while(!isEmptyStack_seq(ptempstack)){
push_seq(pastack,top_seq(ptempstack));
pop_seq(ptempstack);
} /*将临时栈中元素依次弹出,入非临时栈*/
free(ptempstack);
return pastack;
}
(4)代价分析
设队列中的元素个数为n,则算法的时间代价为O(n)。
在算法中,除了定义一个题目要求的栈以外还使用了一个临时栈,所以附加的空间代价为O(n)。
【答案解析】