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

复习栈(stack)的基本操作

C++中的栈(stack)是一种后进先出(Last In First Out, LIFO)的数据结构,是标准模板库(Standard Template Library, STL)的一部分。它允许只在栈顶进行添加(push)或删除(pop)元素的操作。下面列出了C++中使用std::stack时的一些基本操作:

  1. 包含头文件:在使用std::stack之前,需要包含头文件<stack>

    #include <stack>
    
  2. 创建栈:可以创建一个空栈,也可以通过复制另一个栈来创建。

    std::stack<int> myStack; // 创建一个空的int类型的栈
    
  3. 添加元素(push):使用push()方法在栈顶添加一个新元素。

    myStack.push(10); // 在栈顶添加元素10
    
  4. 删除元素(pop):使用pop()方法移除栈顶的元素。注意,pop()方法不返回被移除的元素。

    myStack.pop(); // 移除栈顶元素
    
  5. 访问栈顶元素(top):使用top()方法可以查看栈顶的元素,但不移除它。

    int topElement = myStack.top(); // 获取栈顶元素
    
  6. 检查栈是否为空(empty):使用empty()方法可以检查栈是否为空。如果栈为空,返回true;否则返回false

    bool isEmpty = myStack.empty(); // 检查栈是否为空
    
  7. 获取栈的大小(size):使用size()方法可以获取栈中元素的数量。

    size_t stackSize = myStack.size(); // 获取栈的大小
    

这些操作构成了操作C++中std::stack的基础,足以处理大多数与栈相关的问题。需要注意的是,std::stack是一个容器适配器,它默认使用std::deque作为其底层容器,但也可以通过模板参数指定使用其他类型的容器,比如std::vectorstd::list

复习队列的基本操作

在C++中,队列(queue)是一种先进先出(First In First Out, FIFO)的数据结构,它允许在一端(队尾)添加元素,在另一端(队首)移除元素。这种数据结构在标准模板库(Standard Template Library, STL)中通过std::queue模板类提供。下面是使用std::queue时的一些基本操作:

  1. 包含头文件:在使用std::queue之前,需要包含头文件<queue>

    #include <queue>
    
  2. 创建队列:可以创建一个空队列。

    std::queue<int> myQueue; // 创建一个空的int类型的队列
    
  3. 添加元素(push):使用push()方法在队尾添加一个新元素。

    myQueue.push(10); // 在队尾添加元素10
    
  4. 删除元素(pop):使用pop()方法移除队首的元素。注意,pop()方法不返回被移除的元素。

    myQueue.pop(); // 移除队首元素
    
  5. 访问队首元素(front):使用front()方法可以查看队首的元素,但不移除它。

    int frontElement = myQueue.front(); // 获取队首元素
    
  6. 访问队尾元素(back):使用back()方法可以查看队尾的元素。

    int backElement = myQueue.back(); // 获取队尾元素
    
  7. 检查队列是否为空(empty):使用empty()方法可以检查队列是否为空。如果队列为空,返回true;否则返回false

    bool isEmpty = myQueue.empty(); // 检查队列是否为空
    
  8. 获取队列的大小(size):使用size()方法可以获取队列中元素的数量。

    size_t queueSize = myQueue.size(); // 获取队列中元素的数量
    

这些是std::queue中最基本的操作,足以处理大多数与队列相关的任务。在实际编程中,根据具体需求选择合适的操作来管理数据是非常重要的。

232. 用栈实现队列

Problem: 232. 用栈实现队列

1.思路

我的思路
push :压入栈A中
pop:从栈A取出元素,依次压入栈B,当栈A为空时,栈B的top元素即位队列的首元素,压出栈B的top元素,并从栈B取出元素,依次压回栈A
peek:原理与pop类型
empty:只要判断栈A是否为空即可

栈的pop是没有返回值的,所以int a =sta.pop()是错误的写法,只能用sta.top()获取栈的头部元素

官方题解的思路:
在pop的时候,不需要在把栈B的元素压回道栈A,如果是pop,只要栈B非空,就从栈B的pop输出,如果栈B为空,就将栈A的元素压入到栈B,再从栈B.pop。
push依旧是直接压入栈A,empty需要栈A和栈B均为空。
官方的题解思路会比我自己想的稍微复杂一点点,但是时间复杂度减少了。

2.Code

我的思路

class MyQueue {
private: stack<int> a, b;
public:
    MyQueue() {
    }
    
    void push(int x) {
        a.push(x);
    }
    
    int pop() {
        while(!a.empty()){
            //栈在pop的时候是不会返回头部元素的
            b.push(a.top());
            a.pop();
        }
        int num = b.top();
        b.pop();
        while(!b.empty()){
            a.push(b.top());
            b.pop();
        }
        return num;
    }
    
    int peek() {
    while(!a.empty()){
            b.push(a.top());
            a.pop();
        }
        int num=b.top();
        while(!b.empty()){
            a.push(b.top());
            b.pop();
        }
        return num;
    }
    
    bool empty() {
        return a.empty();
    }

};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

225. 用队列实现栈

Problem: 225. 用队列实现栈

1.思路

我的思路

想要获取到队列的队尾元素,可以用myqueue.back(),但是想删除队列的队尾元素,只能遍历到队列的队尾去删除。但是队列中是没有迭代器去遍历的,只能用队列b暂存队列a的除队尾以外的其他元素,之后在将队列b的元素依次压入队列a中即可。

2.Code

class MyStack {
private: queue<int> a, b;
public:
    MyStack() {}
    
    void push(int x) {
        a.push(x);
    }
    
    int pop() {
        int num;
        while(!a.empty()){
            int cur = a.front();
            if(a.size()==1) num = cur;
            else b.push(cur);
            a.pop();
        }
        while(!b.empty()){
            a.push(b.front());
            b.pop();
        }
        return num;
    }
    
    int top() {
        return a.back();
    }
    
    bool empty() {
        return a.empty();
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */
  • 38
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二算法训练营主要涵盖了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 ``` 以上就是第二十二算法训练营的内容。通过这些题目的练习,可以提升对双指针和滑动窗口等算法的理解和应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值