【算法训练记录——Day10】


● 理论基础
● 232.用栈实现队列
● 225. 用队列实现栈

理论基础

  1. C++中stack 是容器么?
    不是容器,属于容器适配器
    栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。(代码随想录
  2. 我们使用的stack是属于哪个版本的STL?
    SGI STL 对我来说不重要
  3. 我们使用的STL中stack是如何实现的?
    默认使用deque, 但是 list、 vector、 链表都可以
  4. stack 提供迭代器来遍历stack空间么?
    不提供,只有push pop 因为栈的所有元素都必须满足先进后出。
    我们也可以指定vector为栈的底层实现,初始化语句如下:
 // 使用vector为底层容器的栈, 缺省默认为deque
std::stack<int, std::vector<int> > third;

队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器, SGI STL中队列一样是以deque为缺省情况下的底部结构。

232.用栈实现队列

在这里插入图片描述
思路:始终保持一个空栈,每次入队列,先把当前栈中元素放入另一个空栈,再入当前栈,然后将另一个栈中所有元素全都加入当前栈。
即: abcd + null + e = null + dcba + e = e + dcba = null + abcde;
好吧,确实不需要,入队一个栈,出队一个栈,注意pop和peek就行。。

	class MyQueue {
    stack<int> inSt;
    stack<int> outSt;
public:
    MyQueue() {

    }
    
    void push(int x) {
        inSt.push(x);
    }
    
    int pop() {
        if(outSt.empty()) { // 只有输出栈为空的情况下才从输入栈拿
            while(!inSt.empty()) {
                int tmp = inSt.top();
                inSt.pop();
                outSt.push(tmp);
            }
        }
        int tmp = outSt.top();
        outSt.pop();
        return tmp;
    }
    
    int peek() {
        int num = this->pop(); // 直接从输出站取首位。
        outSt.push(num);
        return num;
    }
    
    bool empty() {
        return inSt.empty() && outSt.empty();
    }
};

225.用队列实现栈

在这里插入图片描述
思路:第一反应是一个进一个出,发现不可能。再想想只能是反转后再pop了。
以前不怎么用queue,甚至都忘了有什么方法。上一题首元素用的peek,我也用,发现没有换top,确实是思考一下都费劲。。。整理一下成员函数

back() //返回队列中最后一个元素 
front() //返回队列中的第一个元素 
empty() //判断队列是否为空 
pop() //删除队列的第一个元素 
push() //在队列末尾加入一个元素 
size() //返回队列中元素的个数 
	class MyStack {
    queue<int> que1;
    queue<int> que2;
public:
    MyStack() {

    }
    
    void push(int x) {
        que1.push(x);
        return;
    }
    
    int pop() {
        while(que1.size() > 1){
            int tmp = que1.front();
            que1.pop();
            que2.push(tmp);
        }
        int tmp = que1.front();
        que1.pop();
        while(!que2.empty()) {
            int tmp = que2.front();
            que2.pop();
            que1.push(tmp);
        }
        return tmp;
    }
    
    int top() {
        return que1.back();
    }
    
    bool empty() {
        return que1.empty();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值