栈跟队列

栈跟队列的区别:

栈:先进后出,限定只能在表的一端进行插入和删除(表尾),栈只能从头部取出数据,也就是最先放入的需要遍历整个栈最后才能取出,而且遍历时还得为数据开辟临时空间。

队列:先进先出,只能在表的一端进行插入,并且在表的一端进行删除,遍历数据速度不同,而且可以从头或者尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为遍历过程中不影响数据结构。

相同点:1、都是线性结构。2、插入操作都是在表尾进行。

             3、都可以通过顺序结构和链式结构实现。

             4、插入与删除的时间复杂度都是哦o(1),在空间复杂度上与一样。




栈跟队列的实现

1、两个栈实现一个队列

扫描二维码关注公众号,回复: 2627721 查看本文章
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、递归

队列的应用:树的层次遍历

猜你喜欢

转载自blog.51cto.com/12951882/2156561