标签: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