栈->队列

用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。

 思路:

  1、s1入队,s2出队
  2、s2为空,s1非空,出队时从s1->s2,s1需全部转移
  3、s2、s1非空,优先出s2,直到s2出完,可以继续从s1转移到s2继续出队,直到s1s2都为空才队空。
  4、s2空,s1满,入队时需要s1全部转移到s2,入s1
  5、s1s2满不入队,s1满s2非空也不入队

typedef struct Queue
{
    ArrayStack* s1;
    ArrayStack* s2;
}Queue;
Queue* create_queue(size_t cal)
{
    Queue* queue=malloc(sizeof(Queue));
    queue->s1 = create_array_stack(cal);
    queue->s2 = create_array_stack(cal);
    return queue;  
}
//入队
bool push_queue(Queue* queue,TYPE data)
{
    if(full_array_stack(queue->s1))
    {
        //s1满,s2非空无法入队
        if(!empty_array_stack(queue->s2)) return false;
        while(!empty_array_stack(queue->s1))
        {
            TYPE top;
            top_array_stack(queue->s1,&top);
            push_array_stack(queue->s2,top);
            pop_array_stack(queue->s1);
        }
    }
    printf("tail:%d\n",data);
    //入s1
    return push_array_stack(queue->s1,data);
}
//出队
bool pop_queue(Queue* queue)
{
    if(empty_array_stack(queue->s2))
    {
        if(empty_array_stack(queue->s1)) return false;
        while(!empty_array_stack(queue->s1))
        {
            TYPE top;
            top_array_stack(queue->s1,&top);
            push_array_stack(queue->s2,top);
            pop_array_stack(queue->s1);
        }
    }
    //出s2
    TYPE top=0;
    top_array_stack(queue->s2,&top);
    printf("top:%d\n",top);
    return pop_array_stack(queue->s2);
}
int main(int argc,const char* argv[])
{
    Queue* queue=create_queue(5);
    for(int i=0;i<15;i++)
    {
        push_queue(queue,i+1);
    }
    for(int i=0;i<15;i++)
    {
        pop_queue(queue);
    }
}
posted @ 2023-07-10 19:47  歪爱慕外  阅读(16)  评论(0)    收藏  举报