- 用队列实现栈- LeetCode链接
- 思路
创建两个栈,栈PushStack用来入队列操作,栈PopStack用来出队列操作。由于栈是后进先出,而队列是先进先出。所以当需要入队列时就往栈PushStack插入数据,如果需要出队列就先把PushStack里的数据插入到PopStack里,再出栈即可。
- 图解
实现先进先出
- 代码实现
typedef struct {
ST pushSt;
ST popSt;
} MyQueue;
//创建队列
MyQueue* myQueueCreate() {
MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
StackInit(&obj->pushSt);
StackInit(&obj->popSt);
return obj;
}
//往队列插入数据
void myQueuePush(MyQueue* obj, int x)
{
StackPush(&obj->pushSt,x);
}
//栈PUSH的数据插入到栈POP
void PushSTToPopST(MyQueue* obj)
{
//只有当StackPop里的数据为空时才能转移数据
if(StackEmpty(&obj->popSt))
{
while(!StackEmpty(&obj->pushSt))
{
//StackPush的数据出栈同时栈StackPop数据入栈接收
StackPush(&obj->popSt,Stacktop(&obj->pushSt));
StackPop(&obj->pushSt);
}
}
}
//队列删除元素
int myQueuePop(MyQueue* obj)
{
PushSTToPopST(obj);
//删除元素要判空,走到这里说明StackPop已经不为空了
int front = Stacktop(&obj->popSt);
StackPop(&obj->popSt);
return front;
}
//查看队列头元素
int myQueuePeek(MyQueue* obj)
{
PushSTToPopST(obj);
return Stacktop(&obj->popSt);
}
//队列判空
bool myQueueEmpty(MyQueue* obj)
{
return StackEmpty(&obj->pushSt) &&
StackEmpty(&obj->popSt);
}
//销毁队列空间
void myQueueFree(MyQueue* obj)
{
StackDestroy(&obj->popSt);
StackDestroy(&obj->pushSt);
}