两个队实现栈

原创 2016年05月30日 10:46:55

  我们知道队的特点是先进先出,元素只能从队的尾部进入,只能从队的尾部出来;栈的特点是先进先出,先进栈的元素被压入栈底,后进入的元素覆在栈顶,出栈时也只能从栈的顶部出来。所以我们要借用两个队来实现栈的功能,先不用栈自身的属性却可以实现栈的属性。(队用链表来实现)

  现有两个队,我们将他们分别记为Qin,Qout,开始是将元素插入到Qin中,然后将将除了队尾的元素全部保存到Qout中,保存的过程中依次将这些元素Pop掉,最后Qin中就只剩下开始时队尾的那个元素,现在又将Qout中的元素取出来存到Qin中,这是Qin中的元素顺序就改变了,开始的队尾元素变成了队头元素其它的顺序暂时不变,将Qin队头元素再将其Pop掉就可以了,一次类推就可以实现了栈的后进先出的功能。

wKioL1cLVCqR4kxgAAAhFP3uy_s378.png

(Queue.h)

class Node
{
public:
	Node(const T& data) :_next(NULL), _data(data)
	{}
	Node<T>* _next;
	T _data;
};
template <typename T>
class Queue
{
public:
	Queue(Node<T>* head=NULL) :_head(head), _tail(NULL)
	{
	}
	~Queue()
	{
		if (Empty())
		{
			Node<T>* cur = _head;
			while (cur)
			{
				Node<T>* del;
				del = cur;
				cur = cur->_next;
				delete del;
				del = NULL;
			}
			_head = NULL;
			_tail = NULL;
		}
	}
	Queue(const Queue<T>& q)
	{
			Node<T>* cur = q._head;
			while (cur)
			{
				Push(cur->_data);
				cur = cur->_next;
			}
	}
	Queue<T>& operator=(const Queue<T>& q)
	{
			if (this != &q)
			{
				delete _head;
				_head = NULL;
				Node<T>* cur = q._head;
				while (cur)
				{
					Push(cur->_data);
					cur = cur->_next;
				}
			}
		return *this;
	}
	void Push(const T& d)
	{
		Node<T>* newNode = new Node<T> (d);
		if (_head == NULL)
		{
			_head = newNode;
			_tail = newNode;
		}
		else//实际是尾插
		{
			_tail->_next=newNode;
			_tail = newNode;
		}
	}
	void Pop()//头部删除
	{
		if (Empty())
		{
			if (_head == _tail)//一个节点
			{
				delete _head;
				_head = NULL;
				_tail = NULL;
			}
			else//多个节点
			{
				Node<T>* del = _head;
				_head = _head->_next;
				delete del;
				del = NULL;
			}
		}
	}
	T& Back()
	{
		if (Empty())
		{
			return _tail->_data;
		}
	}
	T& Front()
	{
		if (Empty())
		{
			return _head->_data;
		}
	}
	bool Empty()
	{
		return _head != NULL;
	}
	size_t Size()
	{
		Node<T>* cur = _head;
		size_t count = 0;
		while (cur)
		{
			cur = cur->_next;
			count++;
		}
		return count;
	}
private:
	Node<T>* _head;
	Node<T>* _tail;
};
/*******************************************/
(Stack.h)
class Stack
{
public:
	Stack()
	{
	}
	~Stack()
	{
	}
	Stack(const Stack<T>& s)
	{
	}
	void Push(T d)
	{
		Qin.Push(d);
	}
	bool Empty()
	{
		return Qin.Empty();
	}
	void Pop()
	{
		if (Empty())
		{
			Qin.Pop();
		}
	}
	T& Top()
	{
		if (Empty())
		{
			Swap();
			T ret = Qin.Front();
			return ret;
		}
	}
	void Swap()//对两个队进行改变
	{
		while (Qin.Size() > 1)
		{
			Qout.Push(Qin.Front());
			Qin.Pop();
		}
		while (Qout.Empty())
		{
			Qin.Push(Qout.Front());
			Qout.Pop();
		}
	}
private:
	Queue<T> Qin;//最开始将元素放在Qin中
	Queue<T> Qout;//桥梁作用,用于改变Qin保存元素的工具
};
/************************************/
void test()//输出检验
{
	Stack<int> s1;
	s1.Push(1);
	s1.Push(3);
	s1.Push(5);
	s1.Push(7);
	cout << s1.Top() << endl;
	s1.Pop();
	cout << s1.Top() << endl;
	s1.Pop(); 
	cout << s1.Top() << endl;
	s1.Pop(); 
	cout << s1.Top() << endl;
	s1.Pop();
}


本文出自 “anser” 博客,请务必保留此出处http://674353165.blog.51cto.com/10786549/1762635

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用两个栈实现一个队列

1、题目要求 使用两个栈实现一个队列; 2、考查点定位 栈的链式结构: 通常情况下,我们使用链表来实现栈结构,有利于插入删除操作的效率,而且不用关心栈的溢出情况。 队列的链式结构: 通...
  • pipinuan
  • pipinuan
  • 2016年11月03日 11:39
  • 617

用链表实现栈(Java版)

用链表实现栈 一、算法的思想 用链表实现栈的先进后出,实现栈的push,pop,peak方法。主要就是利用链表的头结点作为栈顶的元素。 1.当要push的时候,相当于新new一个头结点,然后让新...
  • ly969434341
  • ly969434341
  • 2016年05月23日 21:46
  • 2500

栈的两种实现方式:数组和链表

栈的实现与应用 这里介绍两个基本数据类型实现的栈:数组与链表 1.首先我们介绍基于数组来实现栈的过程(直接看代码即可,里面都有详尽的注释) 为了秉承抽象特性,这里将接口操作与接口的实现方法进...
  • u014640201
  • u014640201
  • 2015年09月09日 13:43
  • 823

使用两个队列实现一个栈

首先,我们得了解队列和栈的基本原理。  队列是一个“先进先出“的一个结构。队列的定义是在队尾插入,在队头删除,这就要求要用一种在尾部插入容易的,在头部删除容易的结构,你一定会想到单链表,对,库的实现就...
  • leex_brave
  • leex_brave
  • 2016年05月24日 15:27
  • 824

使用两个栈实现队列的入队、出队

这是数据结构中对栈的一个应用实例,在各大公司的面试中也是常考题,使用栈实现队列的入队、出队操作很简单,只需要两个栈,一个栈负责入栈=入队,另一个栈负责出栈=出队即可。  思路: 使用STL中的stac...
  • sinat_20177327
  • sinat_20177327
  • 2017年08月30日 11:49
  • 253

栈和队列面试题(三)---用两个队列实现一个栈

一:queue是一种”先进先出”的数据结构,他在对尾插入元素,在队头删除元素,他既可以取到自己的队头元素,也可以取到自己的队尾元素; stack是一种”先进后出”的数据结构,他对元素的插入...
  • gogogo_sky
  • gogogo_sky
  • 2017年04月16日 00:48
  • 299

C++两个栈实现一个队列和两个队列实现一个栈

今天用C++实现了下两个栈模拟一个队列和两个队列模拟一个栈!代码可能有很多漏洞,如果读者发现问题, 可以及时反馈,非常感谢!!!         代码如下: #include #include...
  • qianghaohao
  • qianghaohao
  • 2016年05月04日 22:11
  • 885

栈和队列(5)——用一个栈实现对另一个栈的排序

要求: 一个栈的元素为整型,现在想将该栈的从栈顶到底按从小到大的顺序排序,只许申请一个栈。 思考: 将要排序的栈记为stack,申请辅助的栈记为help,在stack栈执行pop操作,弹出的元素记为c...
  • hzd12368
  • hzd12368
  • 2016年09月28日 20:52
  • 525

剑指Offer:面试题7——用两个栈实现队列(java实现)

题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。首先定义两个栈Stack stack1 = new Stack();//作为进队的端口 Stack sta...
  • lilianforever
  • lilianforever
  • 2016年07月05日 13:31
  • 1375

利用两个栈实现队列---入队和出队

栈是先入后出,队列是先入先出。根据这个思想,可以用一个栈作为入队,另一个栈作为出队。只要把第一个栈的栈顶的元素压入第二个栈就好了,出队的时候输出第二个栈的栈顶,如果第二个栈的空了就需要不断操作从第一个...
  • a1b2c3d4123456
  • a1b2c3d4123456
  • 2016年06月01日 10:11
  • 1417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两个队实现栈
举报原因:
原因补充:

(最多只允许输入30个字)