typedef int ElemType;
const ElemType MaxSize = 100;
class Queue {
ElemType data[MaxSize];
int front;
int rear;
public:
Queue(int f_r=-1):front(f_r),rear(f_r){};
~Queue() {};
public:
bool Empty() const;
void Push_Queue(ElemType X);
void Pop_Queue();
ElemType Top()const;
void show()const;
};
bool Queue::Empty()const {
return front == rear;
}
void Queue::Pop_Queue() {
if (rear == front)
if(rear==-1)
throw std::out_of_range("Queue is empty!!");
front += 1;
}
void Queue::Push_Queue(ElemType X) {
if (rear + 1 == MaxSize) //if (rear - front == MaxSize)
throw std::out_of_range("Queue is full!!"); //throw std::out_of_range("Queue is full!!");
else {
rear += 1;
data[rear] = X;
}
}
ElemType Queue::Top()const {
if (!Empty())
return data[rear];
else
throw std::out_of_range("Queue is empty");
}
void Queue::show()const {
if (!Empty()) {
for (int i = front+1; i <= rear; ++i)
std::cout << data[i] << "\n";
}
else
throw std::out_of_range("Queue is empty!!");
}
int main(void)
{
ElemType elem2 = 1;
ElemType elem3 = 2;
ElemType elem4 = 3;
Queue queue;
queue.Push_Queue(elem2);
queue.Push_Queue(elem3);
queue.Push_Queue(elem4);
queue.Pop_Queue();
queue.show();
std::cout<<queue.Top();
return 0;
}
以上是队列的数组的实现,应该比较简单。
下列是队列的链表实现:
原理图:
typedef struct queue_node Queue;
typedef int ElemType;
const ElemType MinSize = -9999;
struct queue_node {
ElemType element;
Queue* next;
};
class ListQueue {
public:
ListQueue(Queue* _fl, std::size_t _s): first(_fl), last(_fl), size(_s) {};
~ListQueue() {};
public:
bool Empty()const;
void Pop();
void Push();
std::size_t Size()const;
void Show()const;
private:
Queue* first;
Queue* last;
std::size_t size;
};
bool ListQueue::Empty()const {
return first->next == last;
}
void ListQueue::Pop() {
if (!Empty()) {
auto delete_node = first;
first= delete_node;
--size;
}
else
throw std::out_of_range("Queue is Empty!!");
}
void ListQueue::Push() {
std::size_t n;
ElemType X;
std::cout << "The number of elements added to the queue is:";
std::cin >> n;
auto p = first;
for (int i = 0; i < n; ++i) {
Queue* s = new Queue;
std::cout << "Please enter a elem :";
std::cin >> X;
s->element = X;
p->next = s;
p = s;
++size;
}
p->next = last;
last->element = MinSize;
}
std::size_t ListQueue::Size()const {
return size;
}
void ListQueue::Show()const {
if (!Empty()) {
auto p = first->next;
while (p->element != MinSize) {
std::cout << p->element << "\n";
p = p->next;
}
}
else
throw std::out_of_range("Queue is Empty!!");
}
int main(void)
{
Queue* qhead = new Queue;
std::size_t t = 0;
ListQueue queue(qhead, t);
queue.Push();
queue.Show();
queue.Pop();
std::cout << "The queue deletes an element:";
queue.Show();
std::cout << "The size of the queue is:" << queue.Size() << "\n";
return 0;
}