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;
else
return 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);
}