C++用数组和链表分别实现Queue

 

昨天写了《C++用数组和链表分别实现Stack》,今天就是《C++用数组和链表分别实现Queue》,废话昨天都说了,今天就是纯代码

 

	template<typename T,typename container>
	class queue 
	{
		public:
			bool empty() const
			{
				return len==0;
			}

			void checkEmpty()
			{
			    if(empty())
				 {
					throw new exception("队列中没有数据");
				 } 
			}

			T& back()
			{
				checkEmpty();
				return cur->val;
			}

			const T& back() const
			{
				 return back();
			}

			void pop()
			{
				checkEmpty();
				if(head->next==cur)
				{
					delete head->next;
					head->next=NULL;
				}else
				{
					node* tmp=head->next;
					head->next=tmp->next;
					delete tmp;
				}
				--len;
			}

			T& front()
			{
				 checkEmpty();
				 return head->next->val; 
			}

			const T& front() const
			{
				return front();
			}

			void push(const T& val)
			{
				node *tmp=new node(val); 
				cur->next=tmp; 
				cur=tmp; 
				++len; 
			}

			queue()
			{
				initialize();
			}

			explicit queue(const container& cont)
			{	
				initialize();
				vector <int>::const_iterator iter=cont.begin();
				while(iter!=cont.end())
				{
					push(*iter++);
				}
			}

			~queue()
			{
				node *tmp;
				while(tmp!=NULL)
				{
					tmp=head;
					head=head->next;
					delete tmp;
					tmp=NULL;
				}
				delete cur;
			}


			int size()
			{
				 return len;
			}

		protected:
			typedef struct node1
			{
				node1 *next;
				T val;
				node1(T v):val(v),next(NULL){} 
			}node;

		private :
			int len; 
			node *head;  
			node *cur; 
			void  initialize()
			{
				head=new node(-1);
				cur=head;
				len=0;
			} 
	};

template<typename T,typename container>
	class queue
	{
		public:
			bool empty() const
			{
				return head==rail;
			}

			void checkEmpty()
			{
			    if(empty())
				 {
					throw new exception("队列中没有数据");
				 } 
			}

			//队尾元素
			T& back()
			{
				checkEmpty();
			    return arr[rail-1];
			}

			const T& back() const
			{
				 return  back();
			}

			//出队
			void pop()
			{
				checkEmpty();
				arr[head++]=0;
			}

			//队头元素
			T& front()
			{
				checkEmpty();
				return arr[head];
			}

			const T& front() const
			{
				 return front();
			}

			//入队
			void push(const T& val)
			{
				if(rail>=capacity){
					capacity=(rail-head)*2;
					T *tmp=new T[capacity];
					int j=0;
					for(int i=head;i<rail;i++)
					{
						tmp[j++]=arr[i];
					}
					delete arr;
					arr=tmp;
					rail=rail-head;
					head=0;
				}
				arr[rail++]=val;
			}

			queue()
			{
				initialize(4);
			}

			queue(int capacity)
			{
				initialize(capacity);
			}

			explicit queue(const container& cont)
			{	
				initialize(cont.size());
				vector <int>::const_iterator iter=cont.begin();
				while(iter!=cont.end())
				{
					push(*iter++);
				}
			}

			~queue()
			{
				delete arr;
			}
 
			//队列中元素个数
			int size()
			{
				 return rail-head;
			}
 
		protected:
			typedef struct node1
			{
				node1 *next;
				T val;
				node1(T v):val(v),next(NULL){} 
			}node;

		private :
			int capacity; 
			int head;//对头元素的位置
			int rail;//对尾元素的位置
			int *arr; 
 
			void  initialize(int cap)
			{
				capacity=cap;
				arr=new int[capacity];
				head=rail=0;
			}
	};



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值