LeetCode | 225. 用队列实现栈
OJ链接
-
此题可以用两个队列去实现一个栈,每次始终保持一个队列为空,
入栈操作相当于给非空队列进行入队操作 -
入数据,把不为空的队列入
-
出数据,把不为空的队列数据导入为空,直到最后一个
-
出栈操作相当于非空队列的队尾元素出队,此时需要把非空队列除最后一个元素之外的其余元素入队到空队列,然后出队最后一个队尾元素
代码如下:
typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QueueNode;typedef struct Queue
{QueueNode* head;QueueNode* tail;
}Queue;void QueueInit(Queue* pq);//队列初始化
void QueueDestroy(Queue* pq);//销毁
void QueuePush(Queue* pq,QDataType x);//添加
void QueuePop(Queue* pq);//删除
QDataType QueueFront(Queue* pq);//头数
QDataType QueueBack(Queue* pq);//尾数
int QueueSize(Queue* pq);//个数
bool QueueEmpty(Queue* pq);//判断是否为空void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;
}
void QueueDestroy(Queue* pq)//销毁
{assert(pq);while (pq->head !=NULL){QueueNode* tmp = pq->head;pq->head = pq->head->next;free(tmp);}pq->head = pq->tail = NULL;
}
void QueuePush(Queue* pq, QDataType x)//添加
{assert(pq);QueueNode* NewNode = (QueueNode*)malloc(sizeof(QueueNode));NewNode->data = x;NewNode->next = NULL;if (pq->head ==NULL)pq->head = pq->tail=NewNode;else{pq->tail->next = NewNode;pq->tail = NewNode;}
}
void QueuePop(Queue* pq)//删除
{assert(pq);assert(pq->head);if (pq->head == pq->tail)pq->tail = NULL;QueueNode* tmp = pq->head->next;free(pq->head);pq->head = tmp;}
QDataType QueueFront(Queue* pq)//头数
{assert(pq);assert(pq->head);return pq->head->data;
}
QDataType QueueBack(Queue* pq)//尾数
{assert(pq);assert(pq->tail);return pq->tail->data;
}
int QueueSize(Queue* pq)//个数
{assert(pq);int count = 0;QueueNode* tmp = pq->head;while (tmp != NULL){count++;tmp = tmp->next;}return count;
}
bool QueueEmpty(Queue* pq)//判断是否为空
{if (QueueSize(pq) == 0)return true;elsereturn false;
}
typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack *obj=(MyStack*)malloc(sizeof(MyStack));QueueInit(&obj->q1);QueueInit(&obj->q2);return obj;
}void myStackPush(MyStack* obj, int x) {Queue*cur=&obj->q1;//选出含有数据的队列if(!QueueEmpty(&obj->q2))cur=&obj->q2;QueuePush(cur,x);
}int myStackPop(MyStack* obj) {Queue*cur1=&obj->q1;//有数据Queue*cur2=&obj->q2;//无数据if(!QueueEmpty(&obj->q2)){cur1=&obj->q2;cur2=&obj->q1;}while(cur1->head!=cur1->tail){QueuePush(cur2,QueueFront(cur1));QueuePop(cur1);}int top=QueueFront(cur1);QueuePop(cur1);return top;
}int myStackTop(MyStack* obj) {Queue*cur=&obj->q1;if(!QueueEmpty(&obj->q2))cur=&obj->q2;return QueueBack(cur);
}bool myStackEmpty(MyStack* obj) {return (QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2));
}void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}