数据结构——队列

定义:

  队列(queue)一种先进先出(first in first out,FIFO)的线性表,只允许在表的一端插入元素,在另一端删除元素。

基本术语:

  队尾(rear):允许插入元素的一端。

  队头(front):允许删除元素的一端。

存储方式:

  1顺序存储方式    2链式存储方式

 

循环队列:

  队列的顺序存储方式使用一个一维数组来实现。

  采用数组来存放队列元素就要解决一个假溢出的问题。所谓假溢出,就是在一个能够存储maxsize个元素的数组中,当rear指针指向了数组中下标为maxsize-1时,又有一个新的元素被插入到队列中,而此时队列却并不是真正存储空间不够而溢出。这种情况的例子如下:

  

解决这个问题方法就是构造一个循环,font=front++%MAXSIZE,取余数。

下面是实现代码:

队列实现
 1 /* ----------------------------------
2 *queue.h
3 *顺序栈实现
4 *编译环境:VS2010,WindowsXP SP3
5 *2010 9-8
6 *--------------------------------- */
7 #include<iostream>
8 using namespace std;
9 #define MAXSIZE 5
10 template<class type> class queue{
11 public:
12 queue();
13 ~queue(void){}
14 void enQueue(const type& item); /*入队操作*/
15 type deQueue(void); /*出队操作,返回弹出值*/
16 bool empty()const; /*判断队列是否为空*/
17 void clear(void); /*清空队列操作*/
18 private:
19 type* _arr; /*队列内存空间*/
20 int _rear; /*队尾指针*/
21 int _front; /*队头指针*/
22 int _currentsize; /*当前队列中元素个数*/
23 };
24
25 /****************具体实现**********************/
26
27 template<class type>
28 queue<type>::queue(){
29 this->_front=this->_rear=0;
30 this->_currentsize=0;
31 _arr=new type[MAXSIZE];
32 }
33
34 template<class type>
35 void queue<type>::enQueue(const type& item){
36 if(this->_front!=this->_rear||this->_currentsize==0){
37 _arr[_front]=item;
38 this->_front=(this->_front++)%MAXSIZE;
39 this->_currentsize++;
40 }
41 else{
42 cout<<"队列已满\n";
43 return ;
44 }
45 }
46
47 template<class type>
48 type queue<type>::deQueue(){
49 if(this->_currentsize!=0){
50 this->_currentsize--;
51 this->_rear=this->_rear%MAXSIZE;
52 return _arr[this->_rear++];
53 }
54 else{
55 cerr<<"队列已空!\n";
56 return -1;
57 }
58 }
59
60
61 template<class type>
62 bool queue<type>::empty()const{
63 return this->_currentsize==0;
64 }
65
66 template<class type>
67 void queue<type>::clear(){
68 this->_currentsize=0;
69 this->_front=this->_rear=0;
70 }

posted @ 2011-09-08 22:37  Hazi  阅读(352)  评论(0编辑  收藏  举报