剑指Offer 09. 用两个栈实现队列

题目描述

思路

看题目没看懂,只看懂用两个栈实现一个队列。队列和栈是特殊的线性表,都有什么特征呢?

  • 栈:先进后出
  • 队列:先进先出

再复习一下C++里面栈(stack)和队列(queue)分别拥有的函数吧

  1. stack
    • empty() 堆栈为空则返回真
    • pop() 移除栈顶元素
    • push() 在栈顶增加元素
    • size() 返回栈中元素数目
    • top() 返回栈顶元素
  2. queue
    • front() 返回队首元素引用
    • back() 返回队尾元素引用
    • push() 在队列尾部增加元素
    • pop() 删除队首元素
    • size() 返回队列元素个数
    • empty() 队列为空则返回true
    • emplace()
    • swap(queue<T> &other_q)

队列的目前用不着,先熟悉stack。由此,这道题的思路就是:

  1. 创建两个栈,一个栈stack1用来实现队尾加入元素,一个栈stack2用来实现队头出元素.
  2. 加入一个元素:直接push到stack1中;
  3. 出一个元素:先将stack1中的元素一个一个出栈到stack2,这样原来stack1栈底的元素就会变成stack2的栈顶元素,也是队列中的第一个元素,将其出栈。出完栈之后再把stack2中的元素重新push到stack1.

代码

 

class CQueue {
public:
    stack<int> stack1;
    stack<int> stack2;
    CQueue() {
    }
    
    void appendTail(int value) {
        stack1.push(value);
    }
    
    int deleteHead() {
        int res;
        if(stack1.empty()){
            return -1;
        }else{
            while(!stack1.empty()){
                int tmp=stack1.top();
                stack1.pop();
                stack2.push(tmp);
            }
            res=stack2.top();
            stack2.pop();
            while(!stack2.empty()){
                int tmp=stack2.top();
                stack2.pop();
                stack1.push(tmp);
            }
        }
        return res;
    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

总结

 

 算法效率有问题,太差了。

 

posted on 2022-01-10 09:55  Taurus20000519  阅读(31)  评论(0)    收藏  举报