#include<iostream>
using namespace std;
const int MAXSIZE = 10;
typedef struct Queue {
int data[MAXSIZE];
int front, rear;
}Queue;
void InitQueue(Queue &Q) {
Q.front = Q.rear = 0;
}
bool QueueEmpty(Queue Q) {
if (Q.front == Q.rear) {
cout<<"Queue is empty"<<endl;
return true;
}
return false;
}
bool QueueFull(Queue Q) {
if (Q.rear-Q.front< MAXSIZE)
return false;
cout<<"Queue is full"<<endl;
return true;
}
bool EnQueue(Queue &Q, int data) {
if (QueueFull(Q)) {
cout<<"Enqueue "<<data<<" failed"<<endl;
return false;
}
if (Q.rear == MAXSIZE && !QueueFull(Q)) {
for (int i=0; i<Q.rear-Q.front; i++)
Q.data[i]=Q.data[i+Q.front];
Q.rear-=Q.front;
Q.front = 0;
}
Q.data[Q.rear++] = data;
return true;
}
bool DeQueue(Queue &Q, int &data) {
if (!QueueEmpty(Q)) {
data = Q.data[Q.front++];
return true;
}
return false;
}
void GetHead(Queue Q, int &head) {
if (!QueueEmpty(Q))
head = Q.data[Q.front];
}
void PrintQueue(Queue Q) {
if (!QueueEmpty(Q))
for (int i=Q.front; i<Q.rear; i++)
cout<<Q.data[i]<<" ";
cout<<endl;
}
int main() {
Queue Q;
InitQueue(Q);
cout<<"Enqueue 10 elements"<<endl;
for (int i=0; i<13; i++)
EnQueue(Q, i), PrintQueue(Q);
cout<<endl<<"Dequeue 5 elements"<<endl;
for (int i=0, e; i<5; i++) {
DeQueue(Q, e);
cout<<"After dequeue "<<e<<endl;
PrintQueue(Q);
}
cout<<endl<<"Enqueue 2 elements"<<endl;
for (int i=0; i<2; i++)
EnQueue(Q, i), PrintQueue(Q);
return 0;
}
// 测试结果
Enqueue 10 elements
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
0 1 2 3 4 5
0 1 2 3 4 5 6
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8 9
Queue is full
Enqueue 10 failed
0 1 2 3 4 5 6 7 8 9
Queue is full
Enqueue 11 failed
0 1 2 3 4 5 6 7 8 9
Queue is full
Enqueue 12 failed
0 1 2 3 4 5 6 7 8 9
Dequeue 5 elements
After dequeue 0
1 2 3 4 5 6 7 8 9
After dequeue 1
2 3 4 5 6 7 8 9
After dequeue 2
3 4 5 6 7 8 9
After dequeue 3
4 5 6 7 8 9
After dequeue 4
5 6 7 8 9
Enqueue 2 elements
5 6 7 8 9 0
5 6 7 8 9 0 1