面试题整理-两个栈实现队列

题目

用两个栈实现队列。

 

解法

准备两个栈。一个是input, 一个是output。

1、入栈:直接用input.push()

2、出栈:如果output非空。则利用output出栈。

                 如果output为空。则把input中的元素全部pop至output栈中。再利用output出栈。

 

说得简单一点就是从input栈进去,从ouput栈出去。明白为什么叫input,output没。

实际上就是利用output栈把出去的顺序颠倒一下。

略微可以优化的,就是在pop的时候,如果要把input全部倒到output中,可以把最后一个元素,留在input中。最后从input那里pop。

 

代码 stas.h

#ifndef _STACK_AS_QUEUE_H
#define _STACK_AS_QUEUE_H

#ifndef _NAME_SPACE_BEGIN_
#define _NAME_SPACE_BEGIN_ namespace stas {
#define _NAME_SPACE_END_ }
#endif
#include <iostream>
#include <stack>

_NAME_SPACE_BEGIN_


template<class T>
class queue {
private:
    std::stack<T> input;
    std::stack<T> output;
private:
    void _pop_input_into_output(const int leave = 0);
public:
    queue() {}
    ~queue(){}
    const bool empty() const;
    void push(const T &v);
    void pop();
    T &top();
};

template<class T>
void queue<T>::_pop_input_into_output(const int leave) {
    while (input.size() > leave) {
        output.push(input.top());
        input.pop();
    }
}

template<class T>
const bool queue<T>::empty() const {
    return input.empty() && output.empty();
}

template<class T>
void queue<T>::push(const T &v) {
    input.push(v);
}

template<class T>
void queue<T>::pop() {
    if (!output.empty()) output.pop();
    else {
        this->_pop_input_into_output(1);
        output.pop();
    }
}

template<class T>
T &queue<T>::top() {
    if (!output.empty()) return output.top();
    else {
        this->_pop_input_into_output();
        return output.top();
    }
}


_NAME_SPACE_END_
#endif  /*end of _STACK_AS_QUEUE_H */



再写个测试的主程序 main.cpp

输入1 x表示把x入队列

输出0表示把队首元素出队。

#include <iostream>
#include <string>
#include <fstream>
#include "stas.h"
using namespace std;
using namespace stas;

int main(int argc, char *argv[]) {
    stas::queue<int> q;
    while (1) {
        int a, b;
        cin >> a;

        if (a%2) { 
            cin >> b;
            q.push(b);
        } else { 
            cout << q.top() << endl; 
            q.pop(); 
        }
    }
    return 0;
}


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值