1.链接:. - 力扣(LeetCode)【点击即可跳转】
思路:
栈 是 后进先出
队列 是 先进先出
(始终保持一个队列为空的思路)
入数据:
往 不为空的队列 中入
出数据:
把不为空的队列数据导出,直到剩最后一个
代码中 队列 的基本实现,不在以下展示,参考之前的文章。
以下为函数的具体实现:
typedef struct
{
Queue q1;
Queue q2;
} MyStack;
MyStack* myStackCreate()
{
MyStack* ps = (MyStack*)malloc(sizeof(MyStack));
if (ps == NULL)
{
exit(-1);
}
QueueInit(&ps->q1);
QueueInit(&ps->q2);
return ps;
}
void myStackPush(MyStack* obj, int x)// 入
{
if (!QueueEmpty(&obj->q1))//不为空
{
QueuePush(&obj->q1, x);
}
else
{
QueuePush(&obj->q2, x);
}
}
//移除并返回栈顶元素
int myStackPop(MyStack* obj) //出
{
//假设
Queue* emptyQ = &obj->q1;
Queue* nonemptyQ = &obj->q2;
if (!QueueEmpty(&obj->q1))
{
emptyQ = &obj->q2;
nonemptyQ = &obj->q1;
}
while (QueueSize(nonemptyQ) > 1)
{ //不为空的队列数据导出,直到剩最后一个
QueuePush(emptyQ, QueueFront(nonemptyQ));
QueuePop(nonemptyQ);
}
int top = QueueFront(nonemptyQ);
QueuePop(nonemptyQ);
return top;
}
int myStackTop(MyStack* obj)
{
if (!QueueEmpty(&obj->q1))
{
return QueueBack(&obj->q1);
}
else
{
return QueueBack(&obj->q2);
}
}
bool myStackEmpty(MyStack* obj)
{
return QueueEmpty((&obj->q1) && QueueEmpty(&obj->q2));
}
void myStackFree(MyStack* obj)
{
QueueDestory(&obj->q1);
QueueDestory(&obj->q2);
free(obj);
}
谢谢观看,希望对你有所帮助