队列的实现, 用单链表实现队列的结构
1>初始化创建队列
2>释放队列
3>清空队列
4>计算队列长度
5>判断队列是否为空
6>打印队列元素
7>入队操作 队尾插入
8>出队操作 队首删除
#include <iostream>
typedef int DataType;
struct QNode
{
DataType data;
QNode* next;
};
struct LQueue
{
QNode* front;
QNode* real;
};
enum Status{OK, ERROR, MEMFAILED};
// 初始化建立队列
int InitQueue(LQueue& que)
{
que.front = (QNode*) malloc(sizeof(QNode));
if (NULL == que.front)
{
return MEMFAILED;
}
que.real = que.front;
que.front->next = NULL;
return OK;
}
// 释放销毁队列
void DestoryQuque(LQueue& que)
{
while(que.front)
{
que.real = que.front->next;
free(que.front);
que.front = que.real;
}
std::cout << "Destory queue succeed ~" << std::endl;
}
// 清空队列
void ClearQueue(LQueue& que)
{
QNode* ptr = que.front->next;
while(NULL != ptr)
{
que.real = ptr->next;
free(ptr);
ptr = que.real;
}
que.real = que.front;
std::cout << "Clear queue succeed ~" << std::endl;
}
// 计算队列长度
int LengthQueue(LQueue& que)
{
int len = 0;
QNode* ptr = que.front;
while(ptr != que.real)
{
++len;
ptr = ptr->next;
}
return len;
}
// 判断队列是否为空
int EmptyQueue(LQueue& que)
{
if (que.front == que.real)
return 1;
return 0;
}
// 打印队列现有元素
void PrintQueue(LQueue& que)
{
QNode* ptr = que.front->next;
std::cout << "Queue elems [";
while(ptr)
{
std::cout << " " << ptr->data;
ptr = ptr->next;
}
std::cout << " ]" << std::endl;
}
// 入队 队尾进去
int PushQueue(LQueue& que, DataType val)
{
QNode* node = (QNode*) malloc(sizeof(QNode));
if (NULL == node)
{
return MEMFAILED;
}
node->data = val;
node->next = NULL;
que.real->next = node;
que.real = node;
return OK;
}
// 出队 对首元素
int PopQueue(LQueue& que, DataType& val)
{
if (que.front == que.real)
return ERROR;
QNode* ptr = que.front->next;
val = ptr->data;
que.front->next = ptr->next;
if (ptr == que.real) // 需要判断是不是最后一个元素
que.real = que.front;
free(ptr);
return OK;
}
int main()
{
LQueue que;
InitQueue(que);
PrintQueue(que);
std::cout << "current queue empty-val :" << EmptyQueue(que) << std::endl;
std::cout << "current queue length :" << LengthQueue(que) << std::endl;
for (int i = 1; i <= 10; i++)
{
PushQueue(que, i);
PrintQueue(que);
std::cout << "current queue empty-val :" << EmptyQueue(que) << std::endl;
std::cout << "current queue length :" << LengthQueue(que) << std::endl;
}
std::cout << "pop " << std::endl;
DataType val;
for (int i = 1; i <= 15; i++)
{
if (ERROR == PopQueue(que, val))
{
std::cout << "Pop error ~~" << std::endl;
break;
}
PrintQueue(que);
std::cout << "current pop val :" << val << std::endl;
std::cout << "current queue length :" << LengthQueue(que) << std::endl;
}
ClearQueue(que);
PrintQueue(que);
std::cout << "current queue length :" << LengthQueue(que) << std::endl;
DestoryQuque(que);
return 0;
}