用两个栈实现一个队列的功能

数据结构的说明:

栈 :先入后出 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;
}

  


posted on 2011-09-27 19:08  dartagnan  阅读(1983)  评论(0编辑  收藏  举报