标签:cout turn return 实现 输出 main pop vat 的区别
栈跟队列的区别:栈:先进后出,限定只能在表的一端进行插入和删除(表尾),栈只能从头部取出数据,也就是最先放入的需要遍历整个栈最后才能取出,而且遍历时还得为数据开辟临时空间。
队列:先进先出,只能在表的一端进行插入,并且在表的一端进行删除,遍历数据速度不同,而且可以从头或者尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为遍历过程中不影响数据结构。
相同点:1、都是线性结构。2、插入操作都是在表尾进行。
3、都可以通过顺序结构和链式结构实现。
4、插入与删除的时间复杂度都是哦o(1),在空间复杂度上与一样。
栈跟队列的实现
1、两个栈实现一个队列
template <typename T> class Queue { public: Queue() {} ~Queue() {} void QueuePush(T x) { _s1.push(x); } T QueuePop() { if (_s2.empty()) { while(!_s1.empty()) { T tmp=_s1.top(); _s1.pop(); _s2.push(tmp); } } T tmp=_s2.top(); _s2.pop(); return tmp; } private: stack<T> _s1; stack<T> _s2; }; void Test() { Queue<int> q; q.QueuePush(1); q.QueuePush(2); q.QueuePush(3); q.QueuePush(4); int ret=q.QueuePop(); ret=q.QueuePop(); q.QueuePush(5); ret=q.QueuePop(); ret=q.QueuePop(); ret=q.QueuePop(); cout<<ret<<endl; } int main() { Test(); return 0; }
2、两个队列实现一个栈
template <typename T> class Stack { public: Stack() {} ~Stack() {} void StackPush(T x) { _q1.push(x); } T StackPop() { if(!_q1.empty()) { while (_q1.size()>1) { T tmp=_q1.front(); _q1.pop(); _q2.push(tmp); } T qt=_q1.front(); _q1.pop(); return qt; } else { while (_q2.size()>1) { T tmp=_q2.front(); _q2.pop(); _q1.push(tmp); } T qe=_q2.front(); _q2.pop(); return qe; } } private: queue<T>_q1; queue<T>_q2; }; void Test() { Stack<int> st; st.StackPush(1); st.StackPush(2); st.StackPush(3); st.StackPush(4); st.StackPop(); st.StackPop(); st.StackPush(5); int ret=st.StackPop(); ret=st.StackPop(); cout<<ret<<endl; } int main() { Test(); return 0; }
栈的应用:1、数制转换 2、逆序输出 3、递归
队列的应用:树的层次遍历
标签:cout turn return 实现 输出 main pop vat 的区别
原文地址:http://blog.51cto.com/12951882/2156561