题目描述:
请你仅使用两个队列实现一个后入先出(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 解题方法:
- 在这个题目中,元素入栈和入队列是一样的操作,不一样的是元素出栈和出队列。
- 需要使用一个计数器size来计算队列中元素的个数。
- 用队列来模拟栈,在实现出栈操作时,我们可以将队列中的size-1个元素先出队列,在重新入队列。此时再执行出队列操作时,去除的元素就和出栈的元素一样了。
ypedef struct {
int *data;
int front;
int rear;
int size;
} MyStack;
MyStack* myStackCreate() {
MyStack* obj=malloc(sizeof(MyStack));
obj->data=malloc(sizeof(int)*20);
obj->front=19;
obj->rear=19;
obj->size=0;
return obj;
}
void myStackPush(MyStack* obj, int x) {
obj->rear=(obj->rear+1)%20;
obj->data[obj->rear]=x;
obj->size+=1;
}
int myqueue_pop(MyStack* obj){
obj->front=(obj->front+1)%20;
obj->size--;
return obj->data[obj->front];
}
int myStackPop(MyStack* obj) {
int x=0;
for(x=0;x<obj->size-1;x++){
myStackPush(obj,myqueue_pop(obj));
}
return myqueue_pop(obj);
}
int myStackTop(MyStack* obj) {
return obj->data[obj->rear];
}
bool myStackEmpty(MyStack* obj) {
if(obj->front==obj->rear) return true;
return false;
}
void myStackFree(MyStack* obj) {
free(obj->data);
free(obj);
}
作者:。。。。
链接:https://leetcode.cn/problems/implement-stack-using-queues/solutions/2516941/shi-yong-yi-ge-zhan-lai-shi-xian-dui-lie-ssdl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。