面试题整理-两个栈实现队列
2012-10-26 16:44
309 查看
题目
用两个栈实现队列。
解法
准备两个栈。一个是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
再写个测试的主程序 main.cpp
输入1 x表示把x入队列
输出0表示把队首元素出队。
用两个栈实现队列。
解法
准备两个栈。一个是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; }
相关文章推荐
- 剑指Offer之面试题7:用两个栈实现队列
- 面试题(九)用两个栈实现队列 标签: 面试题
- 【剑指offer】面试题9:用两个栈实现队列
- (剑指Offer)面试题7:用两个栈实现队列
- 面试题之两个队列实现一个栈
- 剑指offer面试题7:用两个栈实现队列
- 《剑指Offer》面试题七之用两个栈实现队列
- 栈&队列面试题之两个队列实现一个栈
- 剑指Offer:面试题7——用两个栈实现队列(java实现)
- P59、面试题7:用两个栈实现队列
- 数据结构面试题:两个队列实现一个堆栈
- 【练习笔记】剑指offer-面试题7 :用两个栈实现队列
- 剑指offer 面试题7 两个栈实现队列
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
- 面试题7:用两个栈实现队列
- 面试题7:用两个栈实现队列
- 栈的经典面试题之用两个栈实现一个队列
- 面试题7用两个栈实现队列
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 剑指offer面试题7:用两个栈实现队列&用两个队列实现栈