每日一题(3):使用两个栈实现一个队列


1、栈
编程

栈:只容许在固定的一端进行插入和删除元素操做。进入和删除操做的一端称为栈顶,另外一端为栈底。微信

栈特性:后进先出spa

栈功能:将数据从一个序列改变到另外一种序列.net

2、队列code

1.只容许在一端进行插入数据,在另外一端删除数据orm

2.进行插入操做的一端称为队尾(入队列)blog

3.进行删除操做的一端称为队头(出队列)队列

4.队列具备先进先出的特性ip

使用两个栈实现一个队列ci


想法:定义一个结构体里面有两个栈,一个专门用于入数据、一个专门用于出数据,将数据先入栈到栈1中,在将数据搬移到栈2,此过程是:当知足条件栈1不为空,栈2为空时,将栈1的栈顶数据先拿出来放进栈2,这样以此类推,最后再将栈2的数据pop就能够实现一个队列

具体代码以下:

#pragma once#include "stack1.h"#include <stdio.h>typedef struct SQueue{ Stack stack1;//入数据 Stack stack2;//出数据}SQueue; //初始化void Init(SQueue *pSQ){ Stack *p1, *p2; p1 = &(pSQ->stack1); p2 = &(pSQ->stack2); StackInit(p1); StackInit(p2);}//入栈void Push(SQueue *pSQ, SDataType data){ Stack *p1, *p2; p1 = &(pSQ->stack1); p2 = &(pSQ->stack2); StackPush(p1, data);} //出栈void Pop(SQueue *pSQ){ Stack *p1, *p2; p1 = &(pSQ->stack1); p2 = &(pSQ->stack2); SDataType data;   if(StackIsEmpty(p2)) { while(!StackIsEmpty(p1)) { data=StackTop(p1); StackPop(p1); StackPush(p1, data); } } StackPop(p2);} SDataType Front(SQueue *pSQ){ Stack *p1, *p2; p1 = &(pSQ->stack1); p2 = &(pSQ->stack2); SDataType data;  if (StackIsEmpty(p2)) { while (!StackIsEmpty(p1)) { data = StackTop(p1); StackPop(p1); StackPush(p1, data); } } return StackTop(p2);}


本文分享自微信公众号 - C语言与CPP编程(cwdushu)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索