利用队列实现栈
今天我们利用两个队列去实现栈(因为是用c去实现队列没有c++中的库函数所以我们要先手搓一个队列再去使用)
需要队列代码的看我的这篇文章:队列的实现-CSDN博客
全部代码展示需要的自取:
typedef struct {
Queue p1;
Queue p2;
} MyStack;
MyStack* myStackCreate() {
MyStack*obj=(MyStack*)malloc(sizeof(MyStack));
QueueInit(&obj->p1);
QueueInit(&obj->p2);
}
void myStackPush(MyStack* obj, int x) {
if(!QueueEmpty(&obj->p1))
{
QueuePush(&obj->p2,x);
}
else
{
QueuePush(&obj->p1,x);
}
}
int myStackPop(MyStack* obj) {
Queue*empty=&obj->p1;
Queue*nonempty=&obj->p2;
if(!QueueEmpty(&obj->p1))
{
empty=&obj->p2;
nonempty=&obj->p1;
}
while(!QueueEmpty(nonempty)>1)
{
QueuePush(empty,QueueFront(nonempty));
QueuePop(nonempty);
}
int top=QueueFront(nonempty);
return top;
}
int myStackTop(MyStack* obj) {
if(!QueueEmpty(&obj->p1))
{
return QueueBack(&obj->p1);
}else
{
return QueueBack(&obj->p2);
}
}
bool myStackEmpty(MyStack* obj) {
return QueueEmpty(&obj->p1)&&QueueEmpty(&obj->p2);
}
void myStackFree(MyStack* obj) {
QueueDestroy(&obj->p1);
QueueDestroy(&obj->p2);
free(obj);
}
整体思路
因为队列特性是先进先出,利用两个队列一个先存储数据然后与另一个进行交换,只留最后插进来的数据然后弹出最后的数据即可。
分步完成
定义队列
思路解析:
利用结构体对队列进行管理
代码展示:
typedef struct {
Queue p1;
Queue p2;
} MyStack;
初始化队列
思路解析:
因为obj是局部变量所以我们要利用malloc函数在堆上面开空间
代码展示:
MyStack* myStackCreate() {
MyStack*obj=(MyStack*)malloc(sizeof(MyStack));
QueueInit(&obj->p1);
QueueInit(&obj->p2);
}
插入数据
思路解析:
利用empty函数对队列进行判断如果为空就把数据尾插进去。
代码展示:
void myStackPush(MyStack* obj, int x) {
if(!QueueEmpty(&obj->p1))
{
QueuePush(&obj->p2,x);
}
else
{
QueuePush(&obj->p1,x);
}
}
删除并返回栈顶元素
思路解析:
利用while函数进行交换然后返回最后一个数据即可。
代码展示:
int myStackPop(MyStack* obj) {
Queue*empty=&obj->p1;
Queue*nonempty=&obj->p2;
if(!QueueEmpty(&obj->p1))
{
empty=&obj->p2;
nonempty=&obj->p1;
}
while(!QueueEmpty(nonempty)>1)
{
QueuePush(empty,QueueFront(nonempty));
QueuePop(nonempty);
}
int top=QueueFront(nonempty);
return top;
}
返回栈顶元素
思路解析:
利用手搓的back函数对数据进行返回即可。
代码展示:
int myStackTop(MyStack* obj) {
if(!QueueEmpty(&obj->p1))
{
return QueueBack(&obj->p1);
}else
{
return QueueBack(&obj->p2);
}
}
对栈进行判断
思路解析:
直接使用bool函数对代码进行判断
代码展示:
bool myStackEmpty(MyStack* obj) {
return QueueEmpty(&obj->p1)&&QueueEmpty(&obj->p2);
}
销毁程序
思路解析:
先对定义的队列进行销毁然后把这个结构体给free即可。
代码展示:
void myStackFree(MyStack* obj) {
QueueDestroy(&obj->p1);
QueueDestroy(&obj->p2);
free(obj);
}