在我的概念中,队列应该是固定长度的,满了后,队尾插入元素就能把队头元素给挤走,然后其余元素整体移位那种。
但是书中的队列明显不是如此,重点强调的是分清头和尾。
具体该做成怎样,各人根据应用需要自行决定吧。
总体来看,用链表实现比用数组略方便一点。这里仅实现链式队列,不考虑数组循环队列那些了。
和链表大同小异,不过队列的记录从head(tail)变成了front、rear。
代码如下:
/*
2014.4.17
链式队列的简单实现
*/
#include "stdafx.h"
#include <iostream>
using namespace std;
class node
{
public:
int data;
node *next;
};
class MyQueue
{
public:
node *front;
node *rear;
MyQueue();
~MyQueue();
void EnQueue(int data);
bool DeQueue(int *result);
void Show();
};
MyQueue::MyQueue()
{
front = new node;
rear = front;
}
void MyQueue::EnQueue(int data)
{
node *new_node = new node;
new_node->data = data;
new_node->next = NULL;
rear->next = new_node;
rear = new_node;
}
bool MyQueue::DeQueue(int *result)
{
if (front == rear)
{
cout<<"the queue is empty"<<endl;
return 0;
}
else
{
*result = front->next->data; //不能是front->data
node *tmp = front->next;
front->next = front->next->next;
//当队列最后一个元素被删时,队尾指针也丢失了,故需重新赋值
if (front->next == NULL)
{
rear = front;
}
delete tmp;
tmp = NULL;
return 1;
}
}
void MyQueue::Show()
{
if (front == rear)
{
cout<<"the queue is empty"<<endl;
}
else
{
node *tmp = front->next; //同链表,第一个元素在front的下一个位置
while (tmp != NULL) //注意此处不可用tmp != rear
{
cout<<tmp->data<<" ";
tmp = tmp->next; //注意此处不可用tmp++
}
cout<<endl;
}
}
MyQueue::~MyQueue()
{
node *p = front;
while (p != NULL)
{
node *tmp = p;
p = p->next;
delete tmp;
tmp = NULL;
}
}
void main()
{
int result;
MyQueue queue; queue.Show();
queue.DeQueue(&result);
queue.EnQueue(1); queue.Show();
queue.EnQueue(2); queue.Show();
queue.DeQueue(&result);
cout<<result<<endl;
queue.Show();
}
/*
执行结果:
the queue is empty
the queue is empty
1
1 2
1
2
注意点:
1,front自创建后就永远不变了,实际取头元素操作的是front->next
2,当队列最后一个元素被删时,队尾指针也丢失了,故需重新赋值
3,其余注意点基本同链表
*/