栈的原则是先进的后出,而队列是先进先出,那么如何利用两个栈来实现一个队列呢?
我们的思路是利用两个栈,一个栈作为桥梁,而另外一个作为我们的“队列”。实际上,我们首先对桥梁栈进行入栈,入栈完毕后,再依次去桥梁栈内元素,入栈到我们的“队列”当中去,此时我们的桥梁栈的栈顶就变成了我们“队列”里的队尾,而桥梁栈的栈底,则变成了“队列”里的队首。
//实现
#include <stdio.h>
#include "seqstack.h"
typedef struct queue_by2stackInit {
SeqStack input;//这个栈为桥梁栈
SeqStack output;//这个为实际的队列栈
}queue_by2stack;
void queue_by2stackInit(queue_by2stack* q)//初始化新的队列
{
if(q == NULL)
{
return;
}
SeqStackInit(&q->input);
SeqStackInit(&q->output);
return;
}
void queue_by2stackPush(queue_by2stack* q, SeqStackType value)//入队
{
if(q == NULL) {
return;
}
SeqStackType top;
int ret;
while(1) {
ret = SeqStackGetFront(&q->output, &top);
if(ret == -1) {
break;
}
SeqStackPush(&q->input, top);
SeqStackPop(&q->output);
}
SeqStackPush(&q->input, value);
while(1) {
ret = SeqStackGetFront(&q->input, &top);
if(ret == -1) {
break;
}
SeqStackPush(&q->output, top);
SeqStackPop(&q->input);
}
return;
}
void queue_by2stackPop(queue_by2stack* q)//出队
{
if(q == NULL) {
return;
}
SeqStackPop(&q->output);
return;
}
int queue_by2stackTop(queue_by2stack* q, SeqStackType* value)//取队首元素
{
if(q == NULL || value == NULL)
{
return -1;
}
if(q->output.size == 0) {
return -1;
}
SeqStackGetFront(&q->output, value);
return 1;
}
void queue_by2stackPrint(queue_by2stack* q)
{
if(q == NULL) {
return;
}
size_t i = 0;
for(; i < q->output.size; ++i) {
printf("%c ", q->output.data[i]);
}
printf("\n");
}
同样这里,也用到了我们的顺序栈的基本操作函数来帮助我们实现这个队里。
//测试代码
int main()
{
queue_by2stack q;
queue_by2stackInit(&q);
queue_by2stackPush(&q, 'a');
queue_by2stackPush(&q, 'b');
queue_by2stackPush(&q, 'c');
queue_by2stackPush(&q, 'd');
queue_by2stackPrint(&q);
SeqStackType value;
int ret;
ret = queue_by2stackTop(&q,&value);
printf("expected ret 1, actual ret %d\n",ret);
printf("expected value a, actual value %c\n",value);
queue_by2stackPop(&q);
queue_by2stackPrint(&q);
ret = queue_by2stackTop(&q,&value);
printf("expected value b, actual value %c\n",value);
printf("expected ret 1, actual %d\n",ret);
queue_by2stackPop(&q);
queue_by2stackPrint(&q);
ret = queue_by2stackTop(&q,&value);
printf("expected ret 1, actual %d\n",ret);
printf("expected value c, actual value %c\n",value);
queue_by2stackPop(&q);
queue_by2stackPrint(&q);
ret = queue_by2stackTop(&q,&value);
printf("expected ret 1, actual %d\n",ret);
printf("expected value d, actual value %c\n",value);
queue_by2stackPop(&q);
queue_by2stackPrint(&q);
ret = queue_by2stackTop(&q,&value);
printf("expected ret -1, actual %d\n",ret);
return 0;
}
欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!