注:像书中一样,用到了头结点,作用就是像所有的单链表一样:
插入删除首元素时不用对其进行特殊处理。
还需要稍稍注意的东西就是要注意一下空间的分配,和队列为空的情况的处理。都不算难。
空队列:就是头指针和尾指针指向同一个空间。
插入元素,从队尾进,处理一下队尾,然后,若队列为空,注意进入第一个元素时的情况就ok,都很简单。
删除元素:就从队头删除,由于加入了头结点,所以比较方便对于队头的处理。
queue.h
#include<iostream>
using namespace std;
struct list
{
int
data;
//队列中数据
list
*
next;
//表结构体中的链表,用于指向下一个元素
};
class queue
{
private :
list
*
front;
list
*
rear;
public :
queue()
{
front
=
rear
=
new
list;
//初始化,一定要注意分配空间,队列为空,注意头结点和头指针的区别
front
->
next
=
NULL;
}
void
enqueue(
int
elem);
//插入元素为elem 的队尾远么
int
dequeue();
//删除队头元素,并返回其值
void
traverse();
//遍历队列中的元素
};
using namespace std;
struct list
{
};
class queue
{
private :
public :
};
queue.cpp
#include "queue.h"
void queue :: enqueue( int elem)
{
list
*
newlist
=
new
list;
newlist
->
data
=
elem;
newlist
->
next
=
NULL;
if(
front
==
rear)
//说明是空队列
{
front
->
next
=
newlist;
rear
=
newlist;
}
else
{
rear
->
next
=
newlist;
rear
=
newlist;
}
}
int queue :: dequeue()
//从队头出去
{
int
elem;
//用于记录出队列的元素
list
*
temp
=
new
list;
//用于临时存储要出队列队头
if(
front
==
rear)
return
-
1;
else
{
temp
=
front
->
next;
elem
=
temp
->
data;
front
->
next
=
temp
->
next;
}
delete
temp;
return
elem;
}
void queue :: traverse()
//遍历整个队列
{
list
*
temp;
cout
<<
"从队头到队尾的元素分别为:"
<<
endl;
for(
temp
=
front
->
next;
temp
->
next
!=
NULL;
temp
=
temp
->
next)
{
cout
<<
temp
->
data
<<
" ";
}
cout
<<
rear
->
data
<<
endl;
}
void queue :: enqueue( int elem)
{
}
int queue :: dequeue()
{
}
void queue :: traverse()
{
}
main.cpp
#include"queue.h"
int main()
{
queue
q;
q
.
enqueue(
1);
q
.
enqueue(
3);
q
.
traverse();
cout
<<
"删除的元素为:"
<<
endl;
cout
<<
q
.
dequeue()
<<
endl;;
q
.
traverse();
}
int main()
{
}