用两个栈实现一个队列的功能
数据结构的说明:
栈 :先入后出 FILO
队列:先入先出 FIFO
实现方式一,具体:
队列入列:栈A入栈;
举例:将A.B.C.D入列,从栈顶到栈底依次为:D C B A;
队列出列:判断栈元素个数是否为1,如为真,弹出;
如为假,栈A所有元素出栈POP,压入栈B;栈B栈顶元素POP;栈B所有元素压入栈A。
举例:栈A弹栈,栈B压栈,栈B从栈顶到栈底依次为: A B C D; 将栈顶元素A弹栈,将剩余元素压回栈A;栈A从栈顶到栈底依次为: B C D;
实现方式二,具体:
队列入列:判断栈元素个数是否为1,如为真,弹出;
如为假,栈A所有元素出栈POP,压入栈B;压入新元素到栈A;栈B所有元素压栈入栈A。
队列出列:栈A出栈;;
结束,总结:实现了队列的入队和出对操作。
用两个队列实现一个栈的功能
实现方式一,具体:
入栈:所有元素依次入队列A;
举例:将A.B.C.D入栈,从队列尾部到队列首部依次为:D C B A;
出栈:判断栈元素个数是否为1,如为真,队列A出列;
如为假,队列A所有元素出队列,入队列B,最后一个元素不入队列B,输出该元素;队列B所有元素入队列A;
举例:将D C B A出列,D输出来,C B A入队列B,最后返回到队列A。实现了后进先出。
实现方式二,具体:
入栈:和方式一出栈类似
出栈:和方式一入栈类似
结束,总结:实现了栈的入栈和出栈操作。
代码实例
//用两个栈实现队列的功能 template<class T> class deque_from_stack { public: deque_from_stack() { size = 0; } void push(T& element) { stack_one.push(element); size = stack_one.size(); } T pop() { assert(this->size > 0); T result = 0 ; if(1 == this->size) { result = stack_one.top(); stack_one.pop(); this->size = 0; return result; } if(this->size > 1) { while(stack_one.size()) { stack_two.push(stack_one.top()); stack_one.pop(); } result = stack_two.top(); stack_two.pop(); while(stack_two.size()) { stack_one.push(stack_two.top()); stack_two.pop(); } this->size--; return result; } } public: stack<T> stack_one;//栈1 stack<T> stack_two;//栈2 size_t size;//元素的个数计数器 }; int main(int argc, char* argv[]) { int i = 0; //测试一 cout << "deque_from_stack :" <<endl; deque_from_stack<int>d_s_s; for (i = 1; i < 5; i++) { cout << i << " come in " << endl; d_s_s.push(i); } for (i = 1; i < 5; i++) { cout << d_s_s.pop() << " go out " << endl; } cout << endl; }