简单环形队列实现

<pre name="code" class="cpp">// RingQueue.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

/*
	0 1 2 3 4 5 6 7 8 9
	——————————
	——————————
	h	t

 */
template <typename T, size_t MaxCap>
class RingQueue
{
private:
	inline bool isFull() const
	{
		return ((m_tail == m_head) && m_tag);
	}
	inline bool isEmpty() const
	{
		return ((m_head == m_tail) && !m_tag);
	}
public:
	RingQueue() : m_head(0), m_tail(0), m_tag(false){}

	size_t size() const
	{
		if (m_head < m_tail)
			return m_tail - m_head;
		else if (m_head > m_tail)
			return MaxCap - m_head + m_tail;
		else if (isEmpty())
			return 0;
		else
			return MaxCap;
	}
	// 写
	bool push(const T& val)
	{
		if (isFull())
			return false;
		m_arr[m_tail] = val;
		m_tail = (m_tail + 1) % MaxCap;
		if (m_tail == m_head)
		{
			m_tag = true;
		}
		return true;
	}
	bool pop(T& val)
	{
		if (isEmpty())
			return false;
		val = m_arr[m_head];
		m_head = (m_head + 1) % MaxCap;
		if (m_tail == m_head)
		{
			m_tag = false;
		}
		return true;
	}

private:
	T	m_arr[MaxCap];
	int m_head;
	int m_tail;
	bool m_tag;
};

int _tmain(int argc, _TCHAR* argv[])
{
	RingQueue<int, 500> que;
	int i = 0;
	while(que.push(++i))
	{
		printf("当前队列size = %d\n", que.size());
	}
	int nVal = 0;
	while(que.pop(nVal))
	{
		printf("%d \t", nVal);
	}
	getchar();
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值