#include <iostream>
using namespace std;
#define BUF 4
class queue {
private:
struct Node {
int *arr;
int front,rare;
Node* next;
queue* parent_queue;
Node(queue* pq) : front(0),rare(0),next(NULL),parent_queue(pq) {
arr = new int[BUF];
++parent_queue->nNodes;
}
~Node() {
delete[] arr;
--parent_queue->nNodes;
}
void add(int v) {
if(rare >= BUF) return;
arr[rare++] = v;
}
int size() {
return rare-front;
}
};
int nNodes;
Node* head,*tail;
public:
queue() : head(0),tail(0),nNodes(0) {}
bool isEmpty() {
return (nNodes == 0);
}
void enqueue(int v) {
if(!head) {
head = tail = new Node(this);
head->add(v);
} else {
if(tail->rare == BUF) {
tail->next = new Node(this);
tail = tail->next;
}
tail->add(v);
}
}
void dequeue() {
if(isEmpty() || head->front == -1) return;
++head->front;
if(head->front == head->rare) {
Node* temp = head;
head = head->next;
delete temp;
}
}
bool isEmpty() const {
return (nNodes == 0);
}
int getFront() const {
if(isEmpty() || head->front == -1) return -1;
return head->arr[head->front];
}
int size() const {
if(nNodes == 0) {
return 0;
} else if(nNodes >= 2) {
return (nNodes-2)*BUF + head->size() + tail->size();
} else {
return head->size();
}
}
};
int main() {
queue q;
q.enqueue(18);q.enqueue(4);q.enqueue(9);q.enqueue(1);q.enqueue(3);q.enqueue(5);q.enqueue(10);
while(!q.isEmpty()) {
cout << "size = "<<q.size()<<" front = "<<q.getFront() << endl;
q.dequeue();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgQlVGIDQKCmNsYXNzIHF1ZXVlIHsKCXByaXZhdGU6CglzdHJ1Y3QgTm9kZSB7CgkJaW50ICphcnI7CgkJaW50IGZyb250LHJhcmU7CgkJTm9kZSogbmV4dDsKCQlxdWV1ZSogcGFyZW50X3F1ZXVlOwoJCU5vZGUocXVldWUqIHBxKSA6IGZyb250KDApLHJhcmUoMCksbmV4dChOVUxMKSxwYXJlbnRfcXVldWUocHEpIHsKCQkJYXJyID0gbmV3IGludFtCVUZdOwoJCQkrK3BhcmVudF9xdWV1ZS0+bk5vZGVzOwoJCX0KCQl+Tm9kZSgpIHsKCQkJZGVsZXRlW10gYXJyOwoJCQktLXBhcmVudF9xdWV1ZS0+bk5vZGVzOwoJCX0KCQl2b2lkIGFkZChpbnQgdikgewoJCQlpZihyYXJlID49IEJVRikgcmV0dXJuOwoJCQlhcnJbcmFyZSsrXSA9IHY7CgkJfQoJCWludCBzaXplKCkgewoJCQlyZXR1cm4gcmFyZS1mcm9udDsKCQl9Cgl9OwoJaW50IG5Ob2RlczsKCU5vZGUqIGhlYWQsKnRhaWw7CgkKCXB1YmxpYzoKCXF1ZXVlKCkgOiBoZWFkKDApLHRhaWwoMCksbk5vZGVzKDApIHt9CgoJYm9vbCBpc0VtcHR5KCkgewoJCXJldHVybiAobk5vZGVzID09IDApOwoJfQoJCgl2b2lkIGVucXVldWUoaW50IHYpIHsKCQlpZighaGVhZCkgewoJCQloZWFkID0gdGFpbCA9IG5ldyBOb2RlKHRoaXMpOwoJCQloZWFkLT5hZGQodik7CgkJfSBlbHNlIHsKCQkJaWYodGFpbC0+cmFyZSA9PSBCVUYpIHsKCQkJCXRhaWwtPm5leHQgPSBuZXcgTm9kZSh0aGlzKTsKCQkJCXRhaWwgPSB0YWlsLT5uZXh0OwoJCQl9CgkJCXRhaWwtPmFkZCh2KTsKCQl9Cgl9CgkKCXZvaWQgZGVxdWV1ZSgpIHsKCQlpZihpc0VtcHR5KCkgfHwgaGVhZC0+ZnJvbnQgPT0gLTEpIHJldHVybjsKCQkrK2hlYWQtPmZyb250OwoJCWlmKGhlYWQtPmZyb250ID09IGhlYWQtPnJhcmUpIHsKCQkJTm9kZSogdGVtcCA9IGhlYWQ7CgkJCWhlYWQgPSBoZWFkLT5uZXh0OwoJCQlkZWxldGUgdGVtcDsKCQl9Cgl9CgkKCWJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKCQlyZXR1cm4gKG5Ob2RlcyA9PSAwKTsKCX0KCQoJaW50IGdldEZyb250KCkgY29uc3QgewoJCWlmKGlzRW1wdHkoKSB8fCBoZWFkLT5mcm9udCA9PSAtMSkgcmV0dXJuIC0xOwoJCXJldHVybiBoZWFkLT5hcnJbaGVhZC0+ZnJvbnRdOwoJfQkKCQoJaW50IHNpemUoKSBjb25zdCB7CgkJaWYobk5vZGVzID09IDApIHsKCQkJcmV0dXJuIDA7CgkJfSBlbHNlIGlmKG5Ob2RlcyA+PSAyKSB7CgkJCXJldHVybiAobk5vZGVzLTIpKkJVRiArIGhlYWQtPnNpemUoKSArIHRhaWwtPnNpemUoKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gaGVhZC0+c2l6ZSgpOwoJCX0KCX0KfTsKCmludCBtYWluKCkgewoJcXVldWUgcTsKCXEuZW5xdWV1ZSgxOCk7cS5lbnF1ZXVlKDQpO3EuZW5xdWV1ZSg5KTtxLmVucXVldWUoMSk7cS5lbnF1ZXVlKDMpO3EuZW5xdWV1ZSg1KTtxLmVucXVldWUoMTApOwoJd2hpbGUoIXEuaXNFbXB0eSgpKSB7CgkJY291dCA8PCAic2l6ZSA9ICI8PHEuc2l6ZSgpPDwiIGZyb250ID0gIjw8cS5nZXRGcm9udCgpIDw8IGVuZGw7CgkJcS5kZXF1ZXVlKCk7Cgl9CglyZXR1cm4gMDsKfQ==