LeetCode 225.用队列实现栈
思路🤔:
该题所用队列代码在本篇中。我们创建两个队列q1和q2,相互导入数据,入栈就将数据导入在不为空的队列中(如果两个都为空就随便入一个)。出栈时,栈是先进后出,那么就是删除队尾,此时可以将队列中数据移动(Push)到另一个为空的队列中,只剩下最后一个要出栈的数据,按照这个思路来回导入数据即可用队列实现栈。具体步骤看代码注释。
代码🔎:
typedef struct { Queue q1; Queue q2; } MyStack; MyStack* myStackCreate() { MyStack* pst = (MyStack*)malloc(sizeof(MyStack)); assert(pst); QueueInit(&pst->q1); //这里要传地址过去,Init函数需要接收指针,&pst->q1传过去才能正常使用 QueueInit(&pst->q2); return pst; } void myStackPush(MyStack* obj, int x) { assert(obj); if(!QueueEmpty(&obj->q1)) //谁不为空就入队列,都为空就入q2 { QueuePush(&obj->q1,x); } else { QueuePush(&obj->q2,x); } } int myStackPop(MyStack* obj) { assert(obj); Queue* emptyQ = &obj->q1; //先假设q1为空,q2不为空 Queue* nonEmptyQ = &obj->q2; if(!QueueEmpty(&obj->q1)) //如果q1不为空则交换指针,否则不变 { emptyQ = &obj->q2; nonEmptyQ = &obj->q1; } //把非空队列前n个数据导入空队列,剩下一个删掉,就实现了后进先出 while(QueueSize(nonEmptyQ) > 1) { int front = QueueFront(nonEmptyQ); //取到队头 QueuePush(emptyQ,front); //将队头再导入为空的队列中 QueuePop(nonEmptyQ); //删除数据直到剩最后一个 } int top = QueueFront(nonEmptyQ); //保留数据用于返回 QueuePop(nonEmptyQ); //此时删除的数据就是应该出栈的数据 return top; } int myStackTop(MyStack* obj) { assert(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) { assert(obj); QueueDestory(&obj->q1); QueueDestory(&obj->q2); free(obj); //如果只释放了obj那么队列q1和q2都还存在,造成内存泄漏,不过OJ题一般不检查 }