使用两个容量顺序栈来模拟一个队列
分析
要求:
1. 栈2必须空栈,栈1才能入栈
2. 从栈1到栈2必须一个不留地入
代码
注意 : 栈的功能已经实现,只需进行调用
/* 使用两个栈模拟队列功能 */
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 full_queue(Queue* queue)
{
return full_array_stack(queue->s1)
&& full_array_stack(queue->s2);
}
// 队空
bool empty_queue(Queue* queue)
{
return empty_array_stack(queue->s1)
&& empty_array_stack(queue->s2);
}
// 入队
bool push_queue(Queue* queue,TYPE val)
{
if(full_array_stack(queue->s1))
{
if(!empty_array_stack(queue->s2)) return false;
while(!empty_array_stack(queue->s1))
{
TYPE top = 0;
top_array_stack(queue->s1,&top);
pop_array_stack(queue->s1);
push_array_stack(queue->s2,top);
}
}
printf("tail:%d\n",val); //测试
return push_array_stack(queue->s1,val);
}
// 出队
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 = 0;
top_array_stack(queue->s1,&top);
pop_array_stack(queue->s1);
push_array_stack(queue->s2,top);
}
}
TYPE top = 0;
top_array_stack(queue->s2,&top);
printf("top:%d\n",top); //测试
return pop_array_stack(queue->s2);
}