Fork me on GitHub

队列实现栈

利用两个队列实现一个栈

要求:
Push:往非空队列里插入(如果两个队列都是空,选第一个插入)

Pop:从非空队列中 move size - 1 个元素到 空队列中,pop 剩下的一个

Top: 从非空队列中 move size - 1 个元素到 空队列中,返回剩下的一个的值,
把剩下的一个也放入另一个队列中

实现部分

结构体定义

以下代码基于队列的基本操作Queue.h,关于Queue.h请自行在本博客中查找

1
2
3
4
5
6
7
#include "Queue.h"

typedef struct QStack
{
Queue queue1;
Queue queue2;
}QStack;

初始化

1
2
3
4
5
void QStackInit(QStack *pQS)
{
QueueInit(&(pQS->queue1));
QueueInit(&(pQS->queue2));
}

销毁

1
2
3
4
5
void QStackDestory(QStack *pQS)
{
QueueDestroy(&(pQS->queue1));
QueueDestroy(&(pQS->queue2));
}

插入

1
2
3
4
5
6
7
8
9
10
void QStackPush(QStack *pQS,QDataType data)
{
Queue *pNotEmpty = &(pQS->queue2);

if (QueueEmpty(pNotEmpty)) // 如果队列二为空,则不为空的就假设为队列一,就将队列一中的插入队列二
{
pNotEmpty = &(pQS->queue1); //如果队列二不为空,则直接将队列一中的插入队列二
}
QueuePush(pNotEmpty,data);
}

删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void QStackPop(QStack *pQS)
{
Queue *pEmpty = &(pQS->queue1);
Queue *pNotEmpty = &(pQS->queue2);
if (QueueEmpty(pNotEmpty)) //假设队列二是空,如果队列二空,则不空的就是队列一
{
pEmpty = &(pQS->queue2);
pNotEmpty = &(pQS->queue1);
}

while (QueueSize(pNotEmpty) > 1)
{
QDataType data = QueueFront(pNotEmpty);
QueuePop(pNotEmpty);
QueuePush(pEmpty,data);
}

QueuePop(pNotEmpty);
}

获取压入的元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
QDataType QStackTop(QStack *pQS)
{
QDataType data;
QDataType r;
Queue *pEmpty = &(pQS->queue1);
Queue *pNotEmpty = &(pQS->queue2);
if (QueueEmpty(pNotEmpty)) //假设队列二是空,如果队列二空,则不空的就是队列一
{
pEmpty = &(pQS->queue2);
pNotEmpty = &(pQS->queue1);
}

while (QueueSize(pNotEmpty) > 1)
{
data = QueueFront(pNotEmpty);
QueuePop(pNotEmpty);
QueuePush(pEmpty,data);
}

r = QueueFront(pNotEmpty);
QueuePop(pNotEmpty);
QueuePush(pEmpty,r);

return r;
}


void TestQStack()
{
int i = 0;
QStack qstack;
QStackInit(&qstack);

for (i=0;i<9;i++)
{
QStackPush(&qstack,i);

printf("压入第%d ,压入 %d\n",i+1,QStackTop(&qstack));
printf("Top = %d ",QStackTop(&qstack));
//QStackPop(&qstack);
}


}

本文标题:队列实现栈

文章作者:LiuXiaoKun

发布时间:2018年10月14日 - 20:10

最后更新:2018年10月14日 - 20:10

原始链接:https://LiuZiQiao.github.io/2018/10/14/队列实现栈/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%