#include <bits/stdc++.h>

using namespace std;

template<typename Type>
class SeqQueue {
public:
    SeqQueue(int sz) : rear(0), front(0), _count(0), maxSize(sz) {
        data = new Type[sz];
        if (data == NULL) {
            cout << "Error: 初始化失败!" << endl;
            exit(1);
        }
    }

    ~SeqQueue() {
        delete[] data;
    }

    void MakeEmpty();               //make the queue empty
    bool IsEmpty();

    bool IsFull();

    bool Append(const Type item);   //insert data
    Type Delete();                  //delete data
    Type Get();                     //get data
    void Print();                   //print the queue

private:
    int rear;
    int front;
    int _count;
    int maxSize;
    Type *data;
};

template<typename Type>
void SeqQueue<Type>::MakeEmpty() {
    this->_count = 0;
    this->front = 0;
    this->rear = 0;
}

template<typename Type>
bool SeqQueue<Type>::IsEmpty() {
    return _count == 0;
}

template<typename Type>
bool SeqQueue<Type>::IsFull() {
    return _count == maxSize;
}

template<typename Type>
bool SeqQueue<Type>::Append(const Type item) {
    if (IsFull()) {
        cout << "Error: 队列满" << endl;
        return 0;
    }
    data[rear] = item;
    rear = (rear + 1) % maxSize;
    _count++;
    return 1;
}

template<typename Type>
Type SeqQueue<Type>::Delete() {
    if (IsEmpty()) {
        cout << "Error: 队列空" << endl;
        exit(1);
    }
    Type temp = data[front];
    front = (front + 1) % maxSize;
    _count--;
    return temp;
}

template<typename Type>
Type SeqQueue<Type>::Get() {
    if (IsEmpty()) {
        cout << "Error: 队列空" << endl;
        exit(1);
    }
    return data[front];
}

template<typename Type>
void SeqQueue<Type>::Print() {
    cout << "front";
    for (int i = 0; i < _count; i++) {
        cout << "--->" << data[(front + i + maxSize) % maxSize];
    }
    cout << "--->rear" << endl << endl << endl;
}

int main() {
    SeqQueue<int> queue(10);
    int init[10] = {1, 6, 9, 0, 2, 5, 8, 3, 7, 4};
    for (int i = 0; i < 5; i++) {
        queue.Append(init[i]);
    }
    queue.Print();

    cout << queue.Delete() << endl;
    queue.Print();

    for (int i = 5; i < 10; i++) {
        queue.Append(init[i]);
    }
    queue.Print();

    cout << queue.Get() << endl;

    queue.MakeEmpty();
    queue.Print();

    queue.Append(1);
    queue.Print();


    return 0;
}