“.”与“->”的区别:https://blog.csdn.net/q496958148/article/details/80149634
栈的实现:https://blog.csdn.net/q496958148/article/details/80040641
这是一道很经典的面试题,也是我们必须要搞清楚的一个问题。
我们很清楚的知道栈和队列最根本的区别是:栈是先进后出,而队列是先进先出。
那么问题就来了,如何用2个栈实现一个队列呢?
比方说现在要入队列4个元素:a b c d,那么我很明显出队列时必须是按照a b c d的顺序来出队列的。
分析如图:
通过上面的图,我们清晰了该如何实现一个队列的具体思路:
代码如下:
stack.c:
//引用以前的栈函数
#include "seqstack.h"
//创建一个包含俩个栈的结构体
typedef struct my_queue{
seqstack input;//入队列的栈
seqstack output;//出队列的栈
}my_queue;
//初始化
void queueInit(my_queue* root)
{
if(root == NULL)
{
return;
}
seqstackInit(&root->input);
seqstackInit(&root->output);
}
//入队列
void queuePush(my_queue* root,DataType value)
{
if(root == NULL)
{
return;
}
//先检查出队列的栈中有没有元素,有的话记得要将出队列的元素全部移过来,才能入队列
while(root->output.size != 0)//其中“.”与“->”的用法切记不要用错,开头有我的链接
{
DataType top = seqstackGetTop(&root->output);
seqstackPush(&root->input,top);
seqstackPop(&root->output);
}
seqstackPush(&root->input,value);
}
//出队列
void queuePop(my_queue* root)
{
if(root == NULL)
{
return;
}
//和入队列一样,都得判断一下彼此的栈中是否有元素
while(root->input.size != 0)
{
DataType top = seqstackGetTop(&root->input);
seqstackPush(&root->output,top);
seqstackPop(&root->input);
}
seqstackPop(&root->output);
}
//-------------------------------------------------------------
//--------测试代码
//-------------------------------------------------------------
//打印函数
void queueprint(my_queue* root)
{
if(root == NULL)
{
return;
}
int i = root->input.size-1;
printf(" 入队列的栈:[");
for(; i >= 0; i--)
{
printf("%c ",root->input.arr[i]);
}
printf(" ]\n");
printf(" 出队列的栈:[");
for(i = root->output.size-1;i >= 0;i--)
{
printf("%c ",root->output.arr[i]);
}
printf(" ]\n");
}
void testqueue()
{
LINE;
my_queue root;
queueInit(&root);
printf("入队列4个元素:\n");
queuePush(&root,'a');
queueprint(&root);
queuePush(&root,'b');
queueprint(&root);
queuePush(&root,'c');
queueprint(&root);
queuePush(&root,'d');
queueprint(&root);
printf("\n");
printf("出对列4个元素:\n");
queuePop(&root);
queueprint(&root);
queuePop(&root);
queueprint(&root);
queuePop(&root);
queueprint(&root);
queuePop(&root);
queueprint(&root);
}
int main()
{
testqueue();
return 0;
}
效果图: