存档
1 #include "iostream.h"
2 #include "stdlib.h"
3 #define max 20
4 typedef char elemtype;
5 #include "queue.h"
6 void main()
7 {
8 elemtype e;
9 queue q;
10 cout<<"(1)初始化队列q"<<endl;
11 initqueue(q);
12 cout<<"(2)队列为"<<(queueempty(q)?"空":"非空")<<endl;
13 cout<<"(3)依次输入字母序列,以'#'结束:"<<endl;
14 cin>>e;
15 while(e!='#')
16 {
17 enqueue(q,e);
18 cin>>e;
19 }
20 cout<<"(4)队列为"<<(queueempty(q)?"空":"非空")<<endl;
21 e=dequeue(q);
22 cout<<"(5a)出队一个元素dequeue()为:"<<e<<endl;
23 if(dequeue1(q,e))
24 cout<<"(5b)出队一个元素dequeue1()为:"<<e<<endl;
25 cout<<"(6)队列q的元素个数:"<<queuelength(q)<<endl;
26 cout<<"(7)清空队列"<<endl;
27 clearqueue(q);
28 cout<<"(8)队列q的元素个数:"<<queuelength(q)<<endl;
29 cout<<"(9)字符abc依次入队列"<<endl;
30 enqueue(q,'a');
31 enqueue(q,'b');
32 enqueue(q,'c');
33 e=gethead(q);
34 cout<<"(10a)队头元素gethead()为:"<<e<<endl;
35 if (gethead1(q,e))
36 cout<<"(10b)队头元素gethead1()为:"<<e<<endl;
37 cout<<"(11)队列的元素个数:"<<queuelength(q)<<endl;
38 cout<<"(12)所有元素出队列:";
39 while(!queueempty(q))
40 cout<<dequeue(q)<<" ";
41 cout<<endl;
42 cout<<"(13)队列q的元素个数:"<<queuelength(q)<<endl;
43 cout<<"(14)释放队列"<<endl;
44 destoryqueue(q);
45 }
1 typedef struct
2 {
3 elemtype *base;//动态分配存储空间
4 int front;//头指针,若队列不空指向队列队头元素
5 int rear;//尾指针,若队列不空指向队列队尾元素的下一个位置
6 }queue;
7 void initqueue(queue &q)
8 {
9 //初始化队列
10 q.base=new elemtype[max];//分配存储空间
11 if(!q.base)
12 {
13 cout<<"队列分配失败\n";
14 exit(-2);
15 }
16 else
17 q.front=q.rear=0;//初始状态,front和rear都为0
18 }
19 void clearqueue(queue &q)
20 {
21 //清空队列,但不销毁
22 q.front=0;//清空函数,恢复到初始状态
23 q.rear=0;
24 }
25 int queueempty(queue q)
26 {
27 //判断队列是否为空
28 if(q.front==q.rear)//空队列,返回1,否则返回0
29 return 1;
30 else
31 return 0;
32 }
33 int queuelength(queue q)
34 {
35 //求队列中元素个数
36 return (q.rear-q.front+max)%max;//计算队列当前存储的元素数目
37 }
38 void enqueue(queue &q,elemtype e)
39 {
40 //入队列操作
41 if((q.rear+1)%max==q.front)//队满的操作
42 {
43 cout<<"队满,无法插入新元素!"<<endl;
44 exit(-2);
45 }
46 else
47 {
48 q.base[q.rear]=e;//元素e存在当前rear所指位置
49 q.rear=(q.rear+1)%max;//rear指针后移
50 }
51 }
52 elemtype dequeue(queue &q)
53 {
54 //出队列操作
55 if(q.front==q.rear)//空队列不能出队
56 {
57 //队空
58 cout<<"空队列,无法删除头元素!"<<endl;
59 exit(-2);
60 }
61 else
62 {
63 elemtype e=q.base[q.front];//当前的队列头元素作为返回值
64 q.front=(q.front+1)%max;//front指针后移
65 return e;
66 }
67 }
68 int dequeue1(queue &q,elemtype &e)
69 {
70 //出队列操作
71 if(q.front==q.rear)//空队列不能出队
72 {
73 //队空
74 cout<<"空队列,无法删除头元素!"<<endl;
75 return 0;
76 }
77 else
78 {
79 e=q.base[q.front];//当前的队列头元素作为返回值
80 q.front=(q.front+1)%max;//front指针后移
81 return 1;
82 }
83 }
84 elemtype gethead(queue q)
85 {
86 //读队头元素的值,但不删除
87 if(q.front==q.rear)//空队列,无法读
88 {
89 //队空
90 cout<<"空队列,无头元素"<<endl;
91 exit(-2);
92 }
93 else
94 return q.base[q.front];//队列头元素的数组下标即front本身
95 }
96 void destoryqueue(queue &q)
97 {
98 //销毁队列
99 delete q.base;//释放连续的存储空间
100 q.base=NULL;//基地址赋值为空
101 q.front=0;//头指针赋值为0
102 q.rear=0;//尾指针赋值为0
103 }
104 int gethead1(queue q,elemtype &e)
105 {
106 //读队头元素的值,但不删除
107 if(q.front==q.rear)//空队列,无法读
108 {
109 //队空
110 cout<<"空队列,无头元素"<<endl;
111 return 0;
112 }
113 else
114 e=q.base[q.front];//队列头元素的数组下标即front本身
115 return 1;
116 }
运行结果如下: