自己写的一个简陋的C++队列模板

原创 2005年05月23日 00:14:00

说明:

1.这个队列模板逻辑上以循环队列,物理上以元素数组为基础封装

2.队列只能在头出元素,在尾进元素;当头等于尾时认为队列空,当头的下一位置为尾时认为队列满

//--------------------------文件名:queue.h-----------------

#ifndef SUNXYQUEUE_H
#define SUNXYQUEUE_H
const int QDEFAULT=65500;
template<class T>
class SunxyQueue
{
 public:
 SunxyQueue(int s);
  virtual  ~SunxyQueue();
 T Front();
 T Back();
 bool In(T entry);
 T Out();
 int ElemNum();
 bool isEmpty();
 bool isFull();
 virtual void Display();


 private:
 int head,end,size;
 T* array;
};


template<class T>
SunxyQueue<T>::SunxyQueue(int s=QDEFAULT)
{
 head=end=0;
 if(s<=QDEFAULT&&s>0)
  size=s+1;
 else
  size=QDEFAULT+1;
 array=new T[size];
}
template<class T>
SunxyQueue<T>::~SunxyQueue()
{
 head=end=0;size=0;
 delete[] array;
}
template<class T>
T SunxyQueue<T>::Front()
{
 T p;
 if(!this->isEmpty())
  p=array[end];
 return p;
}
template<class T>
T SunxyQueue<T>::Back()
{
 T p;
 if(!this->isEmpty())
  p=(head==0)?array[size-1]:array[head-1];
 return p;
}
template<class T>
bool SunxyQueue<T>::In(T entry)
{
 bool sign;
 if(!this->isFull())
 {
  array[head]=entry;
  head++;
  head=(head<size)?head:(head-size);
  sign=true;
 }
 else
  sign=false;
 return sign;

}
template<class T>
T SunxyQueue<T>::Out()
{
 T p;
 if(!this->isEmpty())
 { 
  p=array[end];
  end++;
  end=(end<size)?end:(end-size);
 }
 return p;
}
template<class T>
int SunxyQueue<T>::ElemNum()
{
 int s;
 if(!this->isEmpty())
 {
  if(this->isFull())
   s=size-1;
  else
   s=(head>end)?(head-end):(size-end+head);
 }
 else
  s=0;
 return s;
}
template<class T>
bool SunxyQueue<T>::isEmpty()
{
 if(head==end)
  return true;
 else
  return false;
}
template<class T>
bool SunxyQueue<T>::isFull()
{
 if((((head+1)<size)?(head+1):(head+1-size))==end)
  return true;
 else
  return false;
}
template<class T>
void SunxyQueue<T>::Display()
{
 //add codes here
 //
}

#endif

//--------------------------queue.h结束---------------------

演示程序:

    N个人站成一圈,从一个人开始(令这个人编号为1,顺时针依次将每个人编号)顺时针依次数数,数到M的人出圈,求最后留下的人编号是什么?(如当N=10,M=3时,结果为4)

//---------------------文件名:queuetest.cpp-----------------

#include <iostream>
#include "queue.h"
#include <stdio.h>
#include <time.h>

using namespace std;
//经测试,N=65000,M=365时,运行时间约为4秒

int main(int argc,char* argv[])
{
 int m=0,n=0;
 while(n<=0)
 {
  cout<<"Please input the N:";
  cin>>n;
 }
 while(m<=0)
 {
  cout<<"Please input the M:";
  cin>>m;
 }
 time_t tstart,tend;
 tstart=time(NULL);
 Queue<int> ring(n);
 int i=1;
 while(!ring.isFull())
  ring.In(i++);
 i=1;
 while(ring.ElemNum()>1)
 {
  while(i<m)
  {
   ring.In(ring.Out());
   i++;
  }
  ring.Out(); 
  i=1;
 }
 cout<<"The last people is:"<<ring.Back()<<endl;
 tend=time(NULL);
 //显示运行时间
 cout<<endl<<"Elapsed time "<<difftime(tend,tstart)<<" seconds."<<endl;
 system("pause");
}


//----------------------queuetest.cpp结束-------------------

一个极其简陋的C/C++日志工具

总用printf来打日志的话,到后面删除起来太麻烦,所以自己写了几个函数来代替printf。其实也就是把printf包装了一下,然后利用宏根据编译选项是否含有-DDEBUG来判断是否把宏展开为功能代码...
  • imred
  • imred
  • 2016年11月10日 13:03
  • 355

C++利用链表模板类实现一个简易队列

设计思想:MyQueue.h中对模板类进行声明和实现。首先定义结点的结构体,包含数据和指针域两部分。队列类定义中声明和实现了元素入队,出队,打印队首元素和队列等方法。注意:1)模板类的声明和定义不能分...

C++利用模板实现一个队列

开头总结:.利用模板类实现了一个队列,利用模板的好处是提供泛型编程,在存储数据的时候会适应不同类型的数据,减少了代码的书写,简化了程序的结构。#include using namespace std...

初用vue2写一个超简陋知乎日报(不与知乎日报api交互)超详细记录

刚学vue,文档还没看全,写一个超简陋版知乎练手记录,因为css不太会所以很难看 会计量超详细记录,主要为做记录 包含左抽屉式导航,下拉更新,上拉加载,轮播 用到: Font Awesome mus...

c++模板类队列

  • 2014年03月01日 22:34
  • 2KB
  • 下载

C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。

C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。 标签: c#objectnewlineexceptionbytestring 2010-05-17 01:10 117...

C++类模板实现的队列

  • 2011年12月21日 15:01
  • 715KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自己写的一个简陋的C++队列模板
举报原因:
原因补充:

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