/*
* Copyright (c) 2012 Fang Ying (Y. Fang), NEU Electric Engineering 20092725 ,fangying712@gmail.com
* Copyright (c) GPLv3
* All Rights Reserved.
* This program is free software;
*you can redistribute it and/or modify it under the terms of the GNU General Public License V3 as published by the
* Free Software Foundation, either version 2 or any later version.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details. A copy of the GNU General Public License is available at:
* http://www.fsf.org/licensing/licenses
*/
#ifndef _SQ_QUEUE_H_
#define _SQ_QUEUE_H_
#include <iostream>
using namespace std;
//定义类模板
template <class T>
class sq_queue
{
private:
int max; //最大存储空间
int front; //队列头
int rear; //队列尾
int sign; //队列状态,0表示空。
T *q; //队列首地址
public:
sq_queue(int max); //构造函数
~sq_queue(); //析构函数
void print(); //输出队列信息
int flag(); //返回队列标识
void insert(T ); //新增元素
T remove(); //删除元素
};
//建立容量为max的循环队列
template <class T>
sq_queue<T>::sq_queue(int max)
{
this->max = max; //队列初始化
q = new T[this->max];
front = this->max;
rear = max;
sign = 0; //表空
return; //表示函数的退出
}
//输出队列的头和队列中的元素
template <class T>
void sq_queue<T>::print()
{
int i;
cout<<"front = "<<front<<endl;
cout<<"rear = "<<rear<<endl;
if (0 == sign)
{
cout<<" queue is empty!"<<endl;
return; //这一句必要的!
}
i = front;
do
{
i++;
if(max+1 == i) i = 1;
cout<<q[i-1]<<endl;
}while(i!=rear);
return;
}
//检测循环队列的状态
template <class T>
int sq_queue<T>::flag()
{
if ( (1==sign) && (rear == front)) return -1;
if ( sign == 0) return 0;
return 1;
}
//入队
template <class T>
void sq_queue<T>::insert(T x)
{
if ((sign == 1)&&(rear==front))
{cout<<"queue overflow!"<<endl; return ;}
rear += 1;
if (rear == max +1) rear = 1;
q[rear -1] = x;
sign = 1;
return ;
}
//退队
template <class T>
T sq_queue<T>::remove()
{
T y;
if( sign==0 )
{cout<<"Queue underflow!"<<endl; return 1;}
front += 1;
if (front == max + 1) front = 1;
y = q[front-1];
if (front == rear) sign=0;
return(y);
}
//书序表空间回收
template <class T>
sq_queue<T>::~sq_queue()
{
delete q;
}
#endif
#include "sq_queue.h"
int main()
{
sq_queue<int> q(10);
cout<<"输出排头指针以及队尾指针:"<<endl;
q.print();
q.insert(50);
q.insert(550);
q.insert(5450);
q.insert(45460);
q.insert(456);
cout<<"再次输出排头指针以及队尾指针:"<<endl;
q.print();
cout<<"输出退栈元素:"<<endl;
cout<<q.remove()<<endl;
cout<<q.remove()<<endl;
cout<<q.remove()<<endl;
cout<<q.remove()<<endl;
cout<<"再次输出排头指针以及队尾指针:"<<endl;
q.print();
return 0;
}