2个栈实现一个队列:https://blog.csdn.net/q496958148/article/details/80214186
队列的实现:https://blog.csdn.net/q496958148/article/details/80041078
在上一篇中我们写了2个栈实现1个队列,其中思想类似。
分析如下:
具体实现如下:
queue.c:
#include "seqqueue.h"
//创建一个包含2个栈的结构体
typedef struct my_stack{
seqqueue input;
seqqueue output;
}my_stack;
//初始化
void stackInit(my_stack* root)
{
if(root == NULL)
{
return;
}
seqqueueInit(&root->input);
seqqueueInit(&root->output);
}
//入栈
void stackPush(my_stack* root,DataType value)
{
if(root == NULL)
{
return;
}
//栈满了
if((root->input.size) + (root->output.size) == seqqueueMaxSize)
{
printf("stack is full!\n");
return;
}
//相当与给空栈入栈,俩个队列谁便那个都可以
if(root->input.size == 0 && root->output.size == 0)
{
seqqueuePush(&root->input,value);
}
//相当于队列1空的,队列2有元素(这种状态之前肯定出过栈)
else if(root->input.size == 0 && root->output.size != 0)
{
seqqueuePush(&root->output,value);
}
//相当于队列1有元素,队列2没有
else if(root->input.size != 0 && root->output.size == 0)
{
seqqueuePush(&root->input,value);
}
//这种情况报错,不存在(多线程情况下出现,线程安全的知识点)
else
{
printf("error!\n");
}
}
//出栈
void stackPop(my_stack* root)
{
if(root == NULL)
{
return;
}
//空栈
if(root->input.size == 0 && root->output.size == 0)
{
printf("stack if null\n");
return;
}
//检查队列1元素是否大于1,大于的话就得搬移元素
while((root->input.size) > 1)
{
DataType top = seqqueueGetTop(&root->input);
seqqueuePush(&root->output,top);
seqqueuePop(&root->input);
}
//有可能只入栈1个,就出栈的情况
if(root->input.size == 1)
{
seqqueuePop(&root->input);
}
//栈1为空
else
{
//检查栈2元素是否>1,成立的话循环搬移元素
while((root->output.size) > 1)
{
DataType top = seqqueueGetTop(&root->output);
seqqueuePush(&root->input,top);
seqqueuePop(&root->output);
}
seqqueuePop(&root->output);
}
}
//取栈顶元素
DataType stackGetTop(my_stack* root)
{
if(root == NULL)
{
return -1;
}
if(root->input.size == 0 && root->output.size == 0)
{
return -1;
}
else if(root->input.size == 0 && root->output.size != 0)
{
return root->output.arr[root->output.size-1];
}
else if(root->input.size != 0 && root->output.size == 0)
{
return root->input.arr[root->input.size-1];
}
else
{
printf("error!\n");
return -1;
}
}
//--------------------------------------------------------------
//---------测试函数
//--------------------------------------------------------------
void stackprint(my_stack* root)
{
if(root == NULL)
{
return;
}
printf("第一个队列:[ ");
int i = 0;
for(;i<root->input.size;i++)
{
printf("%c ",root->input.arr[i]);
}
printf("]\n");
printf("第二个队列:[ ");
for(i = 0;i < root->output.size;i++)
{
printf("%c ",root->output.arr[i]);
}
printf("]\n");
}
void teststack()
{
LINE;
my_stack root;
stackInit(&root);
printf("进栈5个元素:\n");
stackPush(&root,'a');
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
stackPush(&root,'b');
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
stackPush(&root,'c');
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
stackPush(&root,'d');
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
stackPush(&root,'e');
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
printf("\n出栈3个元素:\n");
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
stackPop(&root);
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
stackPop(&root);
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
stackPop(&root);
stackprint(&root);
printf("\n进栈3个元素:\n");
stackPush(&root,'x');
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
stackPush(&root,'y');
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
stackPush(&root,'z');
stackprint(&root);
printf("当前的栈顶: %c\n",stackGetTop(&root));
}
int main()
{
teststack();
return 0;
}
效果实例: