利用栈实现队列
今天我们利用两个栈去实现队列(因为是用c去实现队列没有c++中的库函数所以我们要先手搓一个栈再去使用)
没有实现的去看我的这篇文章:利用顺序表对栈的实现-CSDN博客
回顾一下特性:栈----先进后出、后进先出,队列---先进先出。
实现的大体思路:
1、在存储数据时把数据存储到push中,因为栈是先进后出把push中的数据交换到pop中然后再利用pop函数进行导出即可。
定义结构体:
利用结构体去管理两个栈。
代码实现:
typedef struct {
ST push;
ST pop;
} MyQueue;
初始化栈
思路解析:
因为是局部定义的变量,出作用域会自动销毁,所以在要在开辟一个空间(大小就是两个栈的大小)
代码实现:
MyQueue* myQueueCreate() {
MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));
STInit(&obj->push);
STInit(&obj->pop);
return obj;
}
插入数据
思路解析:
1、利用push函数在push的栈中插入数据
2、在实现push的栈时要用malloc函数进行扩容然后再进行插入。
代码展示:
(这里是调用了上面手搓的push函数有需要的可以看看)
void myQueuePush(MyQueue* obj, int x) {
STPush(&obj->push,x);
}
查看最顶上面的数据
思路解析:
这里就顺便导数据利用上empty函数对两个栈里面进行判断pop是否为空,pop是空就把push的数据导过去,不是空就返回push的数据。
代码展示:
int myQueuePeek(MyQueue* obj) {
if(!STEmpty(&obj->pop))
{
return STTop(&obj->pop);
}
else
{
while(!STEmpty(&obj->push))
{
STPush(&obj->pop,STTop(&obj->push));
STPop(&obj->push);
}
return STTop(&obj->pop);
}
}
弹出数据
思路解析:
利用查找栈顶数据的函数查找并存储到变量中利用pop函数弹出数据并返回存储变量。
代码展示:
int myQueuePop(MyQueue* obj) {
int top=myQueuePeek(obj);
STPop(&obj->pop);
return top;
}
对栈进行判断
思路解析:
利用empty函数对pop和push函数进行判断并利用bool进行返回
代码展示:
bool myQueueEmpty(MyQueue* obj) {
return STEmpty(&obj->pop)&&STEmpty(&obj->push);
}
栈的销毁
思路解析:
利用destroy函数对结构体里面的栈进行销毁然后对obj进行free即可。
代码展示:
void myQueueFree(MyQueue* obj) {
STDestroy(&obj->pop);
STDestroy(&obj->push);
free(obj);
}