循环顺序队列的基本操作

来源:互联网 发布:linux环境apache ab 编辑:程序博客网 时间:2024/06/05 19:48
 
唉,技术不到位,今下午花了近两小时才搞定,队列的入队,出队,输出队列中的所有元素以及判断是否满实现全。
希望对大家有点帮助。希望各位大牛不吝指教。
 
#include<iostream>
using namespace std;
class SqQueue
{
public:
 SqQueue(int size=10){
  base=new int[size];
  front=rear=0;
  queueSize=size;
 }
 ~SqQueue(){
  delete[] base;
 }
 int deQueue(int &e){
  if(isEmpty()){
   cout<<"已空";
   return 1;
  }
  e=base[front];
  front=(front+1)%queueSize;
  return 0;
 }
 int enQueue(int e){
  if(isFull()) {
   cout<<"入队有误,当前已满,不能再入队"<<endl;
   return 1; }
  base[rear]=e;
  rear=(rear+1)%queueSize;
  return 0;
 }
 bool isEmpty(){
  return front==rear? true:false;
 }
 bool isFull(){
  return(rear+1)%queueSize==front? true:false;
 }
 int Empty(){
  if(isEmpty())
   cout<<"为空"<<endl;
  return 0;
 }
 int print(){                                         //这是最让我ballache的一个函数,
  int e;
  if(isEmpty())
   return 1;
  cout<<"此时队列为"<<endl;
  if (front<rear){
  int n=front;
  for( n;n<rear;n++){
  e=base[n];
  cout<<e<<endl;
  }
  }
  else if (front>rear){
   int b=front;
   for(b;(b%queueSize)!=rear; ){                  //技术不够扎,想了好一会儿,囧,这里我用相当于用头指针
    e=base[b];                                               //去遍历的,当front+1=rear时表中元素全部输出,所以限
                                                                   //条件是b%queueSize!=rear。                                                         
      cout<<e<<endl;
      b=(++b%queueSize);                            //当遍历到末尾时,b跳到头部开始遍历
   }                                                              
       
  }
        return 0;
   
 }
  
protected:
 int front;
 int rear;
 int queueSize;
 int *base;
};
int main(){
 SqQueue d;
 cout<<"入队前"<<endl;
 d.Empty();
 cout<<"1进队"<<endl;
 d.enQueue(1);
 cout<<"2进队"<<endl;
 d.enQueue(2);
 cout<<"3进队"<<endl;
 d.enQueue(3);
 cout<<"4进队"<<endl;
 d.enQueue(4);
 cout<<"5进队"<<endl;
 d.enQueue(5);
 cout<<"6进队"<<endl;
 d.enQueue(6);
 cout<<"7进队"<<endl;
 d.enQueue(7);
 cout<<"8进队"<<endl;
 d.enQueue(8);
 cout<<"9进队"<<endl;
 d.enQueue(9);
 cout<<"当前队列为";
 d.print();
 cout<<"10进队"<<endl;
 d.enQueue(10);
 cout<<"11进队"<<endl;
 d.enQueue(11);
 d.print();
 int e;
 d.deQueue(e);
 cout<<"队中第一个元素"<<e<<"出队"<<endl;
 
 d.deQueue(e);
 cout<<"队中第二个元素"<<e<<"出队"<<endl;
 
 d.print();
 cout<<"12入队";
 d.enQueue(12);
 d.print();
 cout<<"13入队";
 d.enQueue(13); 
 d.print();
 cout<<"14入队"<<endl;
 d.enQueue(14);
 return 0;
}
 
//循环顺序队列中最重要的是头尾指针的移动还有最重要的那几个判断条件。
1.当rear>front时,用rear-front算队列长度(代码中没有写,自己可以试试)
  当rear<front时,(rear-front+MAX_SIZE)%MAX_SIZE算循环队列长度
2.当rear=front时,队列为空
  当(rear+1)%MAX_SIZE=front时,队列为满