数据结构之队列

/*

 * Copyright (c) 2012 Fang Ying (Y. Fang), NEU Electric Engineering 20092725 ,[email protected]

 * 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;

}

 

你可能感兴趣的:(数据结构)