我们怎么用两个栈来实现一个队列呢?
首先我们都知道,栈和队列的 出栈和出队列是不一样的,栈是后入先出,队列是先入先出。
所以我们的思路是,用两个栈,一个input,一个output,
我们每次想入栈的时候就先将output里面的元素依次出栈然后往input里面依次入栈,这个时候,input栈顶元素就是最后入栈的元素,我们可以在他后面进行入栈操作,也相当于入队列操作。
那么,我们每次想要出栈的时候,就把我们input栈里面的元素依次出栈,然后依次入栈到output里面,这个时候output里面最上面的元素就是最先入栈的元素,这个时候我们进行出栈操作,就相当于,队列的出队列操作
接下来就是具体的代码实现
#include<stdio.h>
#include"seqstack.h"
#include"seqstack.c"
typedef struct queuestack{
seqstack input;
seqstack output;
}queuestack;
初始化栈
void queuestack_init(queuestack *s)
{
if(s == NULL)
{
return;
}
seqstack_init(s->input);
seqstack_init(s->output);
}
打印函数
void queuestack_print(queuestack *s)
{
if(s == NULL)
{
return;
}
size_t i = 0;
for(;i < s->input.size;i++)
{
printf("[%c] ",s->input.data[i]);
}
printf("\n");
}
入队列函数
void queuestack_push(queuestack *s,seqstacktype value)
{
if(s == NULL)
{
return;
}
if(s->output.size == 0)
{
seqstack_push(&s->input,value);
}
size_t i = 0;
for(;i < s->output.size;i++)
{
seqstacktype top;
seqstack_gettop(&s->output,&top);
seqstack_pop(&s->output);
seqstack_push(&s->input,top);
}
seqstack_push(&s->input,value);
}
出栈函数
void queuestack_pop(queuestack *s)
{
if(s == NULL)
{
return;
}
seqstacktype top;
size_t i =0;
for(;i < s->input.size;i++)
{
seqstack_gettop(&s->input,&top);
seqstack_pop(&s->input);
seqstack_push(&s->output,top);
}
seqstack_pop(&s->output);
}
取栈顶元素
int queuestack_gettop(queuestack *s,seqstacktype *value)
{
if(s == NULL || value == NULL)
{
return 0;
}
seqstacktype top;
size_t i =0;
for(;i < s->input.size;i++)
{
seqstack_gettop(&s->input,&top);
seqstack_pop(&s->input);
seqstack_push(&s->output,top);
}
return seqstack_gettop(&s->output,value);
}
下面是测试函数以及验证结果
如有错误,请指出,谢谢