用队列实现实现栈
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/implement-stack-using-queues/
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
注意:
- 你只能使用队列的基本操作 —— 也就是
push to back
、peek/pop from front
、size
和is empty
这些操作。 - 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
示例:
输入: ["MyStack", "push", "push", "top", "pop", "empty"] [[], [1], [2], [], [], []] 输出: [null, null, null, 2, 2, false]解释: MyStack myStack = new MyStack(); myStack.push(1); myStack.push(2); myStack.top(); // 返回 2 myStack.pop(); // 返回 2 myStack.empty(); // 返回 False
队列的基础操作:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int QSLDataType;
typedef struct QueueNode
{QSLDataType x;struct QueueNode*next;
}QNode;typedef struct Queue
{QNode*head;QNode*tail;
}Queue;void QueueInit(Queue* pq){assert(pq);pq->head=pq->tail=NULL;
}
void QueueDestory(Queue* pq){assert(pq);QNode*cur=pq->head;while(cur){QNode*next=cur->next;free(cur);cur=next;}pq->head=pq->tail=NULL;
}void QueuePush(Queue* pq,QSLDataType x){assert(pq);QNode* newnode=(QNode*)malloc(sizeof(QNode));if(newnode==NULL){printf("malloc fail\n");exit(-1);}newnode->x=x;newnode->next=NULL;if(pq->tail==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->next==NULL){free(pq->head);pq->head=pq->tail=NULL;}else{QNode*next=pq->head->next;free(pq->head);pq->head=next;}
}QSLDataType QueueFront(Queue* pq){assert(pq);assert(pq->head);return pq->head->x;
}
QSLDataType QueueBack(Queue* pq){assert(pq);assert(pq->head);return pq->tail->x;
}int QueueSize(Queue* pq){assert(pq);QNode*cur=pq->head;int cnt=0;while(cur){++cnt;cur=cur->next;}return cnt;
}
bool QueueEmpty(Queue* pq){assert(pq);return pq->head==NULL;
}
int main(){Queue q;QueueInit(&q);QueuePush(&q,1);QueuePush(&q,2);QueuePush(&q,3);QueuePush(&q,4);while(!QueueEmpty(&q)){printf("%d\n",QueueFront(&q));QueuePop(&q);}QueueDestory(&q);return 0;
}
用两个队列实现一个栈。
nonemptyQ是一个指针类型,实现myStackPop不需要对其&。
代码:
typedef struct {Queue q1;Queue q2;
} MyStack;
MyStack* myStackCreate() {MyStack* ps = (MyStack*)malloc(sizeof(MyStack));if (ps == NULL) {printf("malloc fail\n");exit(-1);}QueueInit(&ps->q1);QueueInit(&ps->q2);return ps;
}void myStackPush(MyStack* obj, int x) {assert(obj);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);
}