使用一个队列来模拟栈(力扣第225题)

题目描述:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsize 和 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




​​​​​​​

解题方法: 
  1. 在这个题目中,元素入栈和入队列是一样的操作,不一样的是元素出栈和出队列。
  2. 需要使用一个计数器size来计算队列中元素的个数。
  3. 用队列来模拟栈,在实现出栈操作时,我们可以将队列中的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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值