LeetCode 232.用栈实现队列 C写法
思路🧐:
栈代码在本篇中。与队列实现栈类似,不过这里我们建立两个栈,一个栈专门存放入队数据,一个专门存放出队数据,不需要再来回导数据。原理在于一个栈的数据到另一个栈中,顺序就颠倒了,而颠倒的数据就是队列要出队的顺序。具体思路可以看代码注释。
代码🔎:
typedef struct {ST popst; //用于放出队数据ST pushst; //用于放入队数据 } MyQueue;MyQueue* myQueueCreate() {MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));if(obj == NULL){perror("malloc fail");return NULL;}STInit(&obj->popst); //注意要传地址STInit(&obj->pushst);return obj; }void myQueuePush(MyQueue* obj, int x) {STPush(&obj->pushst, x); //直接push到存数据的栈中 }int myQueuePop(MyQueue* obj) {int front = myQueuePeek(obj); //复用peek函数,取到要出队的数据STPop(&obj->popst); //删除该数据return front; }int myQueuePeek(MyQueue* obj) {if(STEmpty(&obj->popst)) //当popst为空时,代表全部出完,可以继续放数据进去{while(!STEmpty(&obj->pushst)){STPush(&obj->popst,STTop(&obj->pushst)); //将pushst的数据全部放入STPop(&obj->pushst); //删除pushst栈顶数据}}return STTop(&obj->popst); //返回的栈头数据就是第一个要出队列的数据 }bool myQueueEmpty(MyQueue* obj) {return STEmpty(&obj->pushst) && STEmpty(&obj->popst); //两个都为空才是空 }void myQueueFree(MyQueue* obj) {STDestory(&obj->pushst); //所创建的空间要清理干净,避免内存泄漏STDestory(&obj->popst);free(obj); }
STDestory(&obj->popst); free(obj);
}
![image-20240719221440234](https://img-blog.csdnimg.cn/img_convert/4466b02ec35f27d064c4478dbc1ba874.png)