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

来源:互联网 发布:淘宝上传照片尺寸 编辑:程序博客网 时间:2024/05/16 06:36

题目

用两个栈实现队列。

 

解法

准备两个栈。一个是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;}


 

 

原创粉丝点击