代码随想录算法训练营第十天|栈与队列理论基础,232.用栈实现队列,225. 用队列实现栈

栈与队列理论基础

文档讲解:代码随想录
相关资料:菜鸟教程 C++ Stack(栈)菜鸟教程 C++ Queue(队列)

栈是一种先进后出的数据结构,队列是一种先进先出的数据结构,栈和队列都没有走访功能和迭代器。

在SGI STL中,栈的默认底层容器是deque,也可以指定为vectorlist,如

std::stack<int, std::vector<int> > third;  // 使用vector为底层容器的栈

在C++中,栈的常用函数有

函数描述
empty该函数用于测试堆栈是否为空。如果堆栈为空,则该函数返回true,否则返回false。
size该函数返回堆栈容器的大小,该大小是堆栈中存储的元素数量的度量。
top该函数用于访问堆栈的顶部元素。该元素起着非常重要的作用,因为所有插入和删除操作都是在顶部元素上执行的。
push该函数用于在堆栈顶部插入新元素。
pop该函数用于删除元素,堆栈中的元素从顶部删除。

在SGI STL中,队列的默认底层容器同样是是deque,也可以指定为vectorlist,如

std::queue<int, std::list<int> > third;  // 使用list为底层容器的队列

在STL中栈和队列不被归类为容器,而是container adapter(容器适配器)。

在C++中,栈的常用函数有

函数描述
empty该函数用于测试队列是否为空。如果队列为空,则该函数返回true,否则返回false。
size该函数返回队列中元素的个数。
front该函数返回第一个元素。元素起着非常重要的作用,因为所有的删除操作都是在front元素上执行的。
back该函数返回最后一个元素。该元素起着非常重要的作用,因为所有插入操作都在后面元素上执行。
push该函数用于在末尾插入一个新元素。
pop该函数用于删除第一个元素。

232.用栈实现队列

题目链接:232. 用栈实现队列

文档讲解:代码随想录

视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列

思路

设置栈1和栈2,栈1负责输入元素,栈2负责输出元素

push操作直接将元素压入栈1中。

pop操作时,如果栈2为空,则先将栈1中的元素转移至栈2中,这样栈2中的元素顺序与栈1中的顺序相反,栈2栈顶的元素就是队列最前端的元素,直接弹出即可;如果栈2不为空,则直接弹出栈2栈顶的元素即可。

代码

class MyQueue {
public:
    MyQueue() {
    }

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

    int pop() {
        if (stack2.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        int result = peek();
        stack2.pop();
        return result;
    }

    int peek() {
        if (stack2.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        return stack2.top();
    }

    bool empty() {
        if (stack1.empty() && stack2.empty())
            return true;
        else
            return false;
    }

private:
    stack<int> stack1, stack2;
};

225. 用队列实现栈

题目链接:225. 用队列实现栈

文档讲解:代码随想录

视频讲解:队列的基本操作! | LeetCode:225. 用队列实现栈

思路

思路一: 使用两个队列队列1和队列2,其中队列1用于输入和输出元素,队列2用于备份。push时直接将元素入队至队列1中,pop操作时,先将队列1中除最后一个元素外的其余元素入队至队列2中,然后将队列1中剩余的一个元素出队,最后将队列2中的元素移回队列1,这样队列中元素的顺序没有改变。
思路二: 使用一个队列,push时直接将元素入队至队列,pop时,先将队列中除最后一个元素外的其余元素移至队列的末尾,然后使队列第一个元素出队即可。

代码

思路一代码

class MyStack {
public:
    MyStack() {
    }

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

    int pop() {
        int size = q1.size();
        for (int i = 0; i < size - 1; i++) {
            q2.push(q1.front());
            q1.pop();
        }
        int result = q1.front();
        q1.pop();
        while (!q2.empty()) {
            q1.push(q2.front());
            q2.pop();
        }
        return result;
    }

    int top() {
        int result = this->pop();
        this->push(result);
        return result;
    }

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

private:
    queue<int> q1, q2;
};

思路二代码

class MyStack {
public:
    MyStack() {
    }

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

    int pop() {
        int size = q.size();
        for (int i = 0; i < size - 1; i++) {
            q.push(q.front());
            q.pop();
        }
        int result = q.front();
        q.pop();
        return result;
    }

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

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

private:
    queue<int> q;
};
  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值