代码随想录算法训练营第十天 | 232.用栈实现队列、225.用队列实现栈

文章介绍了如何使用两个栈来模拟队列,以及如何用队列实现栈。在栈实现队列中,关键在于利用两个栈处理push和pop操作,保持队列的FIFO特性。而在队列实现栈时,通过不断旋转队列来达到栈的LIFO效果。这些方法展示了数据结构的创新应用。
摘要由CSDN通过智能技术生成

今天进度来到了栈与队列

232.用栈实现队列

力扣题目链接

思路

栈是先进后出,队列是先进先出,那么如何用栈来实现队列呢?

可以使用两个栈,一个输入栈,一个输出栈。

当要push时,就push进输入栈,当要pop时,先判断输出栈是否为空,如果为空的话,就将输入栈里面的元素全部push进输出栈,然后pop一下就可以啦。

至于peek操作,跟pop操作无非是一个是弹出,一个不弹出罢了。

判断队列是否为空的话,如果输入栈和输出栈全部为空,那就算是空了。

代码实现

class MyQueue {
    stack<int>inQ;
    stack<int>outQ;
public:
    MyQueue() {

    }

    void push(int x) {
        inQ.push(x);
    }

    int pop() {
        if(outQ.empty())
            while(!inQ.empty())
            {
                outQ.push(inQ.top());
                inQ.pop();
            }
        int res = outQ.top();
        outQ.pop();
        return res;
    }

    int peek() {
        int res = this->pop();
        outQ.push(res);
        return res;
    }

    bool empty() {
        return inQ.empty()&&outQ.empty();
    }
};

总结

在pop操作时,我在想为什么还要判断输出栈为空,一股脑直接把输入栈的push进输出栈不可以吗?思考之后发现是不可以的,因为此时输出栈的栈顶元素是队列的第一个元素,如果不判断输出栈是否为空就直接push进来的话,栈顶元素就会被更新,替换为其他元素,那么队列的第一个元素也就发生了改变,那么pop的话就会出错。

225.用队列实现栈

力扣题目链接

思路

用队列实现栈,一开始毫无头绪,其实想通之后还是蛮有趣以及好理解的。

push操作的话,就是直接push就可以了。

pop操作就需要好好想一下了,大家想一下,队列是先进先出,栈是先进后出,那么如果我要弹出栈顶元素,那也就是让队列的最后一个元素出队,但是队列只能让队头元素出队呀。

但是!我们可以一直让队头元素出队,然后将这个元素入队,作为队尾,这样的话原来的队尾就鞭变成了队头,可以直接出队了。

top操作的话用一下.back()返回就可以啦。

empty操作的话,队列空了,那这个栈就空了,直接用.empty()判断一下就可以了。

代码实现

class MyStack {
    queue<int>stk;
public:
    MyStack() {

    }

    void push(int x) {
        stk.push(x);
    }

    int pop() {
        int _size = stk.size()-1;
        while(_size--)
        {
            stk.push(stk.front());
            stk.pop();
        }
        int res = stk.front();
        stk.pop();
        return res;
    }

    int top() {
        return stk.back();
    }

    bool empty() {
        return stk.empty();
    }
};

 总结

今天的两道题虽然平常使用不到的,但是还是蛮磨炼思维的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第二十二天的算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,使得子数组的和大于等于给定的目标值。这里可以使用滑动窗口的方法来解决问题。使用两个指针来表示滑动窗口的左边界和右边界,通过移动指针来调整滑动窗口的大小,使得滑动窗口中的元素的和满足题目要求。具体实现代码如下: ```python def minSubArrayLen(self, target: int, nums: List[int]) -> int: left = 0 right = 0 ans = float('inf') total = 0 while right < len(nums): total += nums[right] while total >= target: ans = min(ans, right - left + 1) total -= nums[left] left += 1 right += 1 return ans if ans != float('inf') else 0 ``` 以上就是第二十二天的算法训练营的内容。通过这些题目的练习,可以提升对双指针和滑动窗口等算法的理解和应用能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值