前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >脚撕LeetCode(225)Easy

脚撕LeetCode(225)Easy

作者头像
用户6203048
发布2021-07-14 15:33:43
1370
发布2021-07-14 15:33:43
举报
文章被收录于专栏:JathonKatuJathonKatu

题目地址:https://leetcode-cn.com/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

提示:1 <= x <= 9 最多调用100 次 push、pop、top 和 empty 每次调用 pop 和 top 都保证栈不为空 进阶:你能否实现每种操作的均摊时间复杂度为 O(1) 的栈?换句话说,执行 n 个操作的总时间复杂度 O(n) ,尽管其中某个操作可能需要比其他操作更长的时间。你可以使用两个以上的队列

这个题目的意思就是,让你实现一个栈,实现他的push、pop、top、empty功能,分别是插入,拿出并删除堆中数据,拿出,清空。

这里我想到了用数组和用链表来做的做法,结果如下:

一、数组法

数组法主要是参考ArrayList的思维,这里因为不需要传入一个初始容量,所以直接写死,扩容就是2倍。

执行结果如下:

16 / 16 个通过测试用例

状态:通过

执行用时: 0 ms

内存消耗: 36.3 MB

代码语言:javascript
复制
// 数组实现
// 栈
private int[] value;
// 栈顶指针
private int stackHead = 0;
// 栈容量
private int capacity;
// 栈占用值
private int size = 0;

public Easy225() {
    capacity = 10;
    value = new int[capacity];
}

public void pushMe(int x) {
    if(size == capacity) {
        int[] newValue = new int[capacity << 1];
        System.arraycopy(value,0,newValue,0,size);
        value = newValue;
    }
    value[++stackHead] = x;
    ++size;
}

public int popMe() {
    int ans = topMe();
    --stackHead;
    --size;
    return ans;
}

public int topMe() {
    return value[stackHead];
}

public boolean emptyMe() {
    return 0 == size;
}

二、链表法

链表法主要是保存头尾节点,尾节点就是栈顶,头节点就是栈底(反过来可以当队列用)

执行结果如下:

16 / 16 个通过测试用例

状态:通过

执行用时: 0 ms

内存消耗: 36.1 MB

代码语言:javascript
复制
// 链表实现
private StackNode head;
private StackNode end;

@Data
class StackNode{
    private StackNode preNode;
    private StackNode nextNode;
    private int val;

    public StackNode(int val){
        this.val = val;
    }
}

public Easy225() {

}

public void push(int x) {
    StackNode newEnd = new StackNode(x);
    if (null == head && end == null) {
        head = newEnd;
        end = newEnd;
    } else {
        end.nextNode = newEnd;
        newEnd.preNode = end;
        end = newEnd;
    }
}

public int pop() {
    int ans = top();
    if (head == end) {
        head = null;
        end = null;
    } else {
        this.end = end.preNode;
    }
    return ans;
}

public int top() {
    return end.val;
}

public boolean empty() {
    return null == head && null == end;
}

没有根据题目要求用官方的队列而是自己实现,主要原因是之前面一个大公司的时候让我自己手写实现一个队列,所以这里我就尽可能的自己实现了,可能在算法或者空间上比用api辣鸡,但是至少有这个实现的感觉,以后面试就不慌了,毕竟自己是面向面试学习hhhhhhhhhhhh

next

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JathonKatu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档