【C++学习笔记】用两个队列实现栈

 

需要实现的功能如下:

template<typename T>
class mystack {
    public:
        Stack();
        void push(const T& data);//入栈
        T pop();//出栈
        T top();//返回栈顶元素
        int size() const;//返回栈的大小
        bool empty();//判断是否为空

    private:
        queue<T> q1;
        queue<T> q2;//两个用于实现的队列
        int count;//元素个数
};

当压入第一个元素时,两个队列都为空,随便选哪个都可以,这里我们默认为q1,当再次压入元素时,选择不为空的那个队列:

template<typename T>
void Stack<T>::push(const T& data) {
    if (q1.empty() && q2.empty()) {
        q1.push(data);
    } else {
        if (!q1.empty()) q1.push(data);
        else q2.push(data);
    }
    count++;
}

当需要出栈时,把含有n个元素的那个队列的n-1个元素依次“挪”到空队列,弹出队尾的元素即可:

template<typename T>
T Stack<T>::pop() {
    T value;
    if (!empty()) {
        if (q1.empty()) {
            while (q2.size() >= 2) {
                q1.push(q2.front());
                q2.pop();
            }
            value = q2.front();
            q2.pop();
        } else {
            while (q1.size() >= 2) {
                q2.push(q1.front());
                q1.pop();
            }
            value = q1.front();
            q1.pop();
        }
        count--;
    }
    return value;
}

 全代码:

template<typename T>
class Stack {
    public:
        Stack();
        void push(const T& data);
        T pop();
        T top();
        int size() const;
        bool empty();

    private:
        queue<T> q1;
        queue<T> q2;
        int count;
};

template<typename T>
Stack<T>::Stack() {
    count = 0;
}

template<typename T>
int Stack<T>::size() const {
    return count;
}

template<typename T>
bool Stack<T>::empty() {
    return count == 0;
}

template<typename T>
void Stack<T>::push(const T& data) {
    if (q1.empty() && q2.empty()) {
        q1.push(data);
    } else {
        if (!q1.empty()) q1.push(data);
        else q2.push(data);
    }
    count++;
}

template<typename T>
T Stack<T>::top() {
    if (!q1.empty()) return q1.back();
    return q2.back();
}

template<typename T>
T Stack<T>::pop() {
    T value;
    if (!empty()) {
        if (q1.empty()) {
            while (q2.size() >= 2) {
                q1.push(q2.front());
                q2.pop();
            }
            value = q2.front();
            q2.pop();
        } else {
            while (q1.size() >= 2) {
                q2.push(q1.front());
                q1.pop();
            }
            value = q1.front();
            q1.pop();
        }
        count--;
    }
    return value;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值