问答题 写一个算法(不妨取名为queueToStack),从一个队列创建一个栈,使队列的头为栈顶,队列的尾为栈底,算法的最后要求使队列保持不变。
【正确答案】(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)。
【答案解析】