【剑指offer系列】 栈和队列___7

时间:2022-06-05 17:40:42

  题目描述:
  用两个栈实现一个队列
  
  队列的声明如下:

template<typename T> class Queue{
public:
    void appendTail(const T& node);
    T deleteHead();
private:
    stack<T> stack1;
    stack<T> stack2;

  实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点。
  
  分析:
  以两个栈作为辅助空间,当要插入节点时,往stack1中压入。当要删除节点时,将stack1中的元素出栈,并加入到stack2中。然后stack2的栈顶元素即可看做队列的头部。
  
  示例:
  插入元素1、2、3、4,首先将这些元素都压入stack1中,则stack1中从栈顶往下依次为4、3、2、1,;
  当要删除队列头部元素时,首先将stack1中元素都压入stack2中,则stack2从栈顶往下依次为1、2、3、4,然后栈顶元素1即为队列的头部元素
  
  代码:   

template<typename T>
void Queue<T>::appendTail(const T& node){
    stack1.push(node);
}

template<typename T>
T Queue<T>::deleteHead(){
    if(stack2.empty()){
        while(!stack1.empty()){
            T& elem=stack1.top();
            stack1.pop();
            stack2.push(elem);
        }
    }
    if(stack2.empty())   return throw new exception("empty stack");
    T elem=stack2.top();
    stack2.pop();
    return elem;
}

  相关题目:
  1、用两个队列实现一个栈 (leetcode225)
  
  分析:
  入栈和出栈的顺序是相反的,因此用两个队列存储元素时要实现元素的逆序。
  因此必须始终保持一个队列为空,当要压入元素时,先将其加入到空队列的头部,然后将另一个队列的元素一个一个的加入到这个队列中。
  示例:
  1)加入元素1,则q1中为1
  2)加入元素2,q2为空,先将其加入q2,再将q1的元素依次加入q2,则q2为1、2
  3)加入元素3,q1为空,先将其加入q1,再将q2的元素依次加入q1,则q1为1、2、3
  对于栈来说,此时栈顶元素为3,栈底元素为1。即stack.top()为3.而此时刚好q1.front()也为3.
  
  代码:

class Stack {
public:
    void push(int x) {
        if(q1.empty()){
            q1.push(x);
            while(!q2.empty()){
                int elem=q2.front();
                q2.pop();
                q1.push(elem);
            }
        }else{
            q2.push(x);
            while(!q1.empty()){
                int elem=q1.front();
                q1.pop();
                q2.push(elem);
            }
        }
    }
    void pop() {
        if(empty()) return;
        if(q2.empty())  q1.pop();
        else    q2.pop();
    }
    int top() {
        if(empty()) return -1;
        if(q2.empty()){
            return q1.front();
        }else{
            return q2.front();
        }
    }
    bool empty() {
        return q1.empty()&&q2.empty();
    }
private:
    queue<int> q1;
    queue<int> q2;
};


2、 实现包含min函数的栈(剑指offer21)

3、 判断出栈顺序是否合法(剑指offer22)