1.链接:. - 力扣(LeetCode)【点击即可跳转】
思路:
栈 是 后进先出
队列 是 先进先出
(始终保持一个队列为空的思路)
入数据:
往 不为空的队列 中入
出数据:
把不为空的队列数据导出,直到剩最后一个
代码中 队列 的基本实现,不在以下展示,参考之前的文章。
以下为函数的具体实现:
typedef struct
{Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate()
{MyStack* ps = (MyStack*)malloc(sizeof(MyStack));if (ps == NULL){exit(-1);}QueueInit(&ps->q1);QueueInit(&ps->q2);return ps;
}void myStackPush(MyStack* obj, int x)// 入
{if (!QueueEmpty(&obj->q1))//不为空{QueuePush(&obj->q1, x);}else{QueuePush(&obj->q2, x);}
}
//移除并返回栈顶元素
int myStackPop(MyStack* obj) //出
{//假设Queue* emptyQ = &obj->q1;Queue* nonemptyQ = &obj->q2;if (!QueueEmpty(&obj->q1)){emptyQ = &obj->q2;nonemptyQ = &obj->q1;}while (QueueSize(nonemptyQ) > 1){ //不为空的队列数据导出,直到剩最后一个QueuePush(emptyQ, QueueFront(nonemptyQ));QueuePop(nonemptyQ);}int top = QueueFront(nonemptyQ);QueuePop(nonemptyQ);return top;
}int myStackTop(MyStack* obj)
{if (!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);}else{return QueueBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj)
{return QueueEmpty((&obj->q1) && QueueEmpty(&obj->q2));
}void myStackFree(MyStack* obj)
{QueueDestory(&obj->q1);QueueDestory(&obj->q2);free(obj);
}
谢谢观看,希望对你有所帮助