day10 | 栈、队列互相实现

147 阅读1分钟
  • c++ 栈的底层实现可以是vector,deque,list(可插拔的底层实现), 主要就是数组和链表的底层实现;
  • SGI STL中,栈、队列底层实现缺省情况下一样使用deque实现的;
  • 两者不允许有遍历行为,不提供迭代器
  • stack.pop()是无返回值的

232. 用栈实现队列

题目链接:leetcode.cn/problems/im…

要点

  • pop的实现:每次要将所有in栈中的元素置于out栈中,不可只转移部分(破坏顺序)
  • peek巧妙地利用pop

栈实现队列

class MyQueue {
public:
    stack<int> stackIn;
    stack<int> stackOut;

    MyQueue() {
    }
    
    void push(int x) {
        stackIn.push(x);
    }
    
    int pop() {
        if (stackOut.empty()) {
            while (!stackIn.empty()) {
                stackOut.push(stackIn.top());
                stackIn.pop();
            }
        }
        int res = stackOut.top();
        stackOut.pop();
        return res;
    }
    
    int peek() {
        int res = this->pop();
        stackOut.push(res);
        return res;
    }
    
    bool empty() {
        return stackIn.empty() && stackOut.empty();
    }
};

总结

分别用in栈和out栈实现了队列的操作,思路清晰,就是两个栈中元素的转移是有需要注意的细节

225. 用队列实现栈

题目链接:leetcode.cn/problems/im…

要点

  • 不像上题用两个栈实现队列,本题不能用类似的两个队列实现栈,因为在两个队列里捣,元素的顺序还是FIFO
  • 主要就是pop的逻辑,别的都可以直接调队列的函数实现;pop时,把除了队尾元素的其他元素都重新出队入队一次

队列实现栈

class MyStack {
public:
    queue<int> que;

    MyStack() {

    }
    
    void push(int x) {
        que.push(x);
    }
    
    int pop() {
        int size = que.size();
        --size;

        while(size--) {
            que.push(que.front());
            que.pop();
        }
        int res = que.front();
        que.pop();
        return res;
    }
    
    int top() {
        return que.back();
    }
    
    bool empty() {
        return que.empty();
    }
};

总结

std实现的栈和队列,pop方法都是无返回值的,通过top、front、back获取端的元素。