栈->队列
用两个栈来实现一个队列,使用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);
}
}