解题思路:
此题可以用两个栈实现,一个栈进行入队操作,另一个栈进行出队操作
出队操作: 当出队的栈不为空是,直接进行出栈操作,如果为空,需要把入队的栈元素全部导入到出队的栈,然后再进行出栈操作
栈的相关操作:https://blog.csdn.net/Immaturecld/article/details/105441167
typedef struct {
//入队栈
Stack pushST;
//出队栈
Stack popST;
} MyQueue;
//先创建两个栈
MyQueue* myQueueCreate(int maxSize) {
MyQueue* pqueue = (MyQueue*)malloc(sizeof(MyQueue));
StackInit(&pqueue->pushST, maxSize);
StackInit(&pqueue->popST, maxSize);
return pqueue;
}
// 将一个元素放入队列的尾部
void myQueuePush(MyQueue* obj, int data) {
//入队栈进行入栈操作
StackPush(&obj->pushST, data);
}
//从队列首部移除元素
int myQueuePop(MyQueue* obj) {
//如果出队栈为空,导入入队栈的元素
if(StackEmpty(&obj->popST) == 0){
while(StackEmpty(&obj->pushST) != 0){
StackPush(&obj->popST, StackTop(&obj->pushST));
StackPop(&obj->pushST);
}
}
int front = StackTop(&obj->popST);
//出队栈进行出队操作
StackPop(&obj->popST);
return front;
}
//返回队列首部的元素
int myQueuePeek(MyQueue* obj) {
//类似于出队操作
if(StackEmpty(&obj->popST) == 0){
while(StackEmpty(&obj->pushST) != 0){
StackPush(&obj->popST, StackTop(&obj->pushST));
StackPop(&obj->pushST);
}
}
return StackTop(&obj->popST);
}
//返回队列是否为空
bool myQueueEmpty(MyQueue* obj) {
return StackEmpty(&obj->pushST) == 0&& StackEmpty(&obj->popST) == 0;
}
//销毁
void myQueueFree(MyQueue* obj) {
StackDestroy(&obj->pushST);
StackDestroy(&obj->popST);
free(obj);
}