最近做音视频的解码学习。需要用到队列来解析与同步音频与视频帧,又重新研究了一下队列。
一个简单的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 范围,使其变成负数,由此获取的数组的下标就是错误的,这里这个要注意一下。
运行结果: