[DS&A]队列

来源:互联网 发布:java第三方登录接口 编辑:程序博客网 时间:2024/06/06 01:07

队列实现:1.使用链表类的组合实现

                  2.使用数组实现(循环)。

下面提供了第二种实现,注意首尾下标的增减公式,另:为什么size()中计算队列的有效个数公式,在下列情况(满队)失效。

//数组实现队列--循环队列#include<iostream>using namespace std;const int Max = 5;typedef int T;class queue{private:  T arr[Max];  int front,rear; //front指向队首前一个位置,rear指向队尾元素  bool flag;  //标志位,区别满队和空队  public:  queue();  queue& Enqueue(T data);  T Dequeue();  bool Qempty();  bool Qfull();  int size();  void clear();  void travel();  };queue::queue():front(0),rear(0),flag(0){}queue& queue::Enqueue(T data){  if(Qfull())  {cout << "队满,无法添加" << endl;return (*this);  }  rear = (++rear)%Max;  arr[rear] = data;  flag = 1;  return (*this);}T queue::Dequeue(){  if(Qempty())  {cout << "队空!无法删除" << endl;return 0;  }  T data = arr[front + 1];  front = (++front)%Max;  flag = 0;  return data;}bool queue::Qempty(){  if((front == rear)&& !flag)//当flag=0时说明上次操作是出队return 1;  return 0;}bool queue::Qfull(){  if((front == rear)&& flag)return 1;  return 0;}int queue::size(){  if(Qfull()) return Max;     //当队列满的时候不符合公式?  return (Max+rear-front)%Max;}void queue::clear(){  flag = 0;  //设置flag表示出队操作  rear = front = 0;  return;}void queue::travel(){   if(Qempty())   {cout << "队空!无法遍历"<< endl;return ;  }  int f= (front+1)%Max,cnt = size();  for(int i = 0; i < cnt; i++)  {cout << arr[f] << " ";f= (f+1)%Max;   }  cout << endl;  return; }int main(){  queue q;  q.Enqueue(5).Enqueue(4).Enqueue(3).Enqueue(2).Enqueue(1);  q.travel();  q.Enqueue(0);  cout << q.Dequeue() << endl << "出队后:";  q.travel();  q.clear();  cout << "清队后:" ;  q.travel();  return 0;}

输出结果:


0 0
原创粉丝点击