C++对列的数组实现

最近做音视频的解码学习。需要用到队列来解析与同步音频与视频帧,又重新研究了一下队列。

一个简单的int型队列实现。

头文件:

#ifndef CMYQUE_H
#define	CMYQUE_H

 class MyQue{
  
public:	
	MyQue(int size); 
	~MyQue();
	bool Read(int* num);
	bool Wirte(int num);//写入
	void Clear();
	bool IsFull();
	bool IsEmpty();
	int Size();
private:
	int len;
	int SIZE;
	int w_ptr;
	int r_ptr;
	int* Que;
};

 
#endif

cpp文件:

#include"CMyque.h"
MyQue::MyQue(int size)
{
	len = 0;
	w_ptr = 0;
	r_ptr = 0;
	SIZE = size;
	Que = new int[SIZE];
}
MyQue::~MyQue()
{
   delete[] Que;
}
bool MyQue::IsEmpty()
{
	if(len == 0)
	return true;
	else
	return false;
}
bool MyQue::IsFull()
{
	if(len == SIZE)
	return true;
	else
	return false;
}
int MyQue::Size()	 //获取队列长度
{
	return len;
}
 //int 的字符长度有限制,如果重复使用一直增加的话可能会导致数组指针错误	超出int 最大值变为负数
bool MyQue::Wirte(int num)	
{							 
	if(len == SIZE) //满了
	  return false;

	w_ptr = w_ptr%SIZE;	//这样就不超出int范围,大小一直保持在 0-SIZE 之间

	Que[w_ptr] = num; //循环使用数组

	len +=1;		//长度加1
	w_ptr += 1;		//下标+1
	return true;
}
bool MyQue::Read(int* num)
{
   if(len == 0)
	  return false;
	r_ptr = r_ptr%SIZE;
    *num = Que[r_ptr];
	r_ptr += 1;
	len --;
	return true;
}
void MyQue::Clear()	//清空指针 使其复用即可
{
   	len = 0;
	r_ptr = 0;
	w_ptr = 0;
	return ;
}

mian文件测试程序:

#include "CMyque.h"
#include <stdio.h>
int pwer(int m ,int n)
{
  int t = 1;
  if(n>0)
	 t = m*pwer(m,--n);
 return t;
}

int main(int argc,char*argv)
{
	MyQue q(5);
	for(int m = 0 ; m<5;m++)
	 q.Wirte(m);
	//int kk = 0;
	//kk = pwer(2,31);//此时获取值为负数
	//int qq = kk%5;

	for(int m = 0 ; m<3;m++)
	{	
		int n;
		q.Read(&n);
		printf("数组元素:%d 出队,序号:%d \n",n,m);
	}
	printf("此时数组大小为:%d \n",q.Size());
	for(int m = 10 ; m<15;m++)
	{
		q.Wirte(m);
	}
	printf("此时数组大小为:%d \n",q.Size());
	for(int m = 0 ; m<5;m++)
	{	
		int n = 0;
		q.Read(&n);
		printf("数组元素:%d 出队,序号:%d \n",n,m);
	}
	getchar();
	return 0;
}

主函数里实现了一个回调函数用来判断int 的范围大小,因为在循环队列中,下标指针是一直增加的,一直循环使用,有可能会超出其int 范围,使其变成负数,由此获取的数组的下标就是错误的,这里这个要注意一下。

运行结果:




猜你喜欢

转载自blog.csdn.net/qq_36568418/article/details/80322405