分析:
思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再倒回给stack1
思路二:入队时,判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接压入stack1中
出队时,判断stack2是否为空,如果stack2为空,则将stack1中的元素倒入stack2中,在将stack2的栈顶元素弹出,否则,直接弹出stack2的栈顶元素
思路三:入队时,直接压入stack1中
出队时,判断stack2是否为空,如果stack2为空,则将stack1中的元素倒入stack2中,否则直接弹出stack2中的元素
下面实现的是思路一
//QueueS.h
#pragma once
#include "Stack.h"
typedef struct QueueS {
Stack stack1;
Stack stack2;
}QueueS;
void QueueSInit(QueueS* pQS); //初始化
void QueueSPush(QueueS* pQS, StackDataType data); //插入
void QueueSPop(QueueS* pQS); //删除
StackDataType QueueSFront(QueueS* pQS); //获取首元素
void TestQueueS(); //测试函数
#include"QueueS.h"
void QueueSInit(QueueS* pQS)
{
StackInit(&(pQS->stack1));
StackInit(&(pQS->stack2));
}
void QueueSPush(QueueS* pQS, StackDataType data)
{
//无脑入栈1
StackPush(&(pQS->stack1), data);
}
void QueueSPop(QueueS* pQS)
{
if (StackIsEmpty(&(pQS->stack2))) {
while (!(StackIsEmpty(&(pQS->stack1)))) {
StackDataType s1 = getTop(&(pQS->stack1));
StackPush(&(pQS->stack2), s1);
StackPop(&(pQS->stack1));
}
}
StackPop(&(pQS->stack2));
}
StackDataType QueueSFront(QueueS* pQS)
{
if (StackIsEmpty(&(pQS->stack2))) {
while (!(StackIsEmpty(&(pQS->stack1)))) {
StackDataType s1 = getTop(&(pQS->stack1));
StackPush(&(pQS->stack2), s1);
StackPop(&(pQS->stack1));
}
}
return getTop(&(pQS->stack2));
}
void TestQueueS()
{
QueueS qs;
QueueSInit(&qs);
for (int i = 0; i < 10; i++) {
QueueSPush(&qs, i);
}
for (int i = 0; i < 10; i++) {
printf("%d\n", QueueSFront(&qs));
QueueSPop(&qs);
}
}