数据结构之队列顺序表示与实现2
2017-07-27 20:16
375 查看
针对上一节队列顺序表示的缺点,做了少许改进,队列出队时无需大量移动元素
#include <iostream>
using namespace std;
#define QUEUE_INIT_SIZE 10
#define QUEUE_INCREMENT_SIZE 2
typedef int DataType;
struct SqQueue2
{
DataType* base;
int front;
int rear;
int queuesize;
};
//队列的初始化
bool SqQueue2Init(SqQueue2& Q)
{
Q.base = (DataType*)malloc(sizeof(DataType));
if (!Q.base)
{
cout << "malloc error" << endl;
return false;
}
Q.front = Q.rear = 0;
Q.queuesize = QUEUE_INIT_SIZE;
return true;
}
//销毁队列
void SqQueue2Destroy(SqQueue2& Q)
{
free(Q.base);
Q.base = NULL;
Q.front = Q.rear = 0;
Q.queuesize = 0;
}
//清空队列
void SqQueue2Clear(SqQueue2& Q)
{
Q.front = Q.rear = 0;
}
//获取队列长度
int SqQueue2Length(SqQueue2 Q)
{
return(Q.rear - Q.front);
}
//获取队头
bool SqQueue2GetHead(SqQueue2 Q,DataType& e)
{
if (Q.rear == Q.front)
return false;
e = Q.base[Q.front];
return true;
}
//入队
bool SqQueue2Insert(SqQueue2& Q,DataType e)
{
if (Q.rear >= Q.queuesize)
{
Q.base = (DataType*)realloc(Q.base, (Q.queuesize + QUEUE_INCREMENT_SIZE) * sizeof(DataType));
if (!Q.base)
{
cout << "realloc error" << endl;
return false;
}
Q.rear = Q.queuesize;
Q.queuesize += QUEUE_INCREMENT_SIZE;
}
Q.base[Q.rear++] = e;
return true;
}
//出队
bool SqQueue2Delete(SqQueue2& Q, DataType& e)
{
if (Q.rear == Q.front)
return false;
e = Q.base[Q.front];
Q.front++;
return true;
}
//队列的遍历
void SqQueue2Traverse(SqQueue2 Q, void(*visit)(DataType))
{
while (Q.front < Q.rear)
{
visit(Q.base[Q.front++]);
}
cout << endl;
}
void visit(DataType c)
{
cout << " " << c;
}
void main()
{
DataType e0;
SqQueue2 Q;
SqQueue2Init(Q);
cout << "向队列中插入元素为:";
for (int i = 1; i <= 5; i++)
{
SqQueue2Insert(Q,i);
}
SqQueue2Traverse(Q,visit);
cout << "此时队列的长度为:" << SqQueue2Length(Q) << endl;
SqQueue2GetHead(Q,e0);
cout << "队列的队头为:" << e0 << endl;
SqQueue2Delete(Q,e0);
cout << "队头出队后,队列的长度为:" << SqQueue2Length(Q) << endl;
cout << "队头出队后,队列元素为:";
SqQueue2Traverse(Q,visit);
SqQueue2Clear(Q);
cout << "清空队列后,队列的长度为:" << SqQueue2Length(Q) << endl;
system("pause");
}
由程序分析,尽管本程序在队列出队时不需要大量移动元素,但是当队列元素较多进行操作是比较浪费空间
#include <iostream>
using namespace std;
#define QUEUE_INIT_SIZE 10
#define QUEUE_INCREMENT_SIZE 2
typedef int DataType;
struct SqQueue2
{
DataType* base;
int front;
int rear;
int queuesize;
};
//队列的初始化
bool SqQueue2Init(SqQueue2& Q)
{
Q.base = (DataType*)malloc(sizeof(DataType));
if (!Q.base)
{
cout << "malloc error" << endl;
return false;
}
Q.front = Q.rear = 0;
Q.queuesize = QUEUE_INIT_SIZE;
return true;
}
//销毁队列
void SqQueue2Destroy(SqQueue2& Q)
{
free(Q.base);
Q.base = NULL;
Q.front = Q.rear = 0;
Q.queuesize = 0;
}
//清空队列
void SqQueue2Clear(SqQueue2& Q)
{
Q.front = Q.rear = 0;
}
//获取队列长度
int SqQueue2Length(SqQueue2 Q)
{
return(Q.rear - Q.front);
}
//获取队头
bool SqQueue2GetHead(SqQueue2 Q,DataType& e)
{
if (Q.rear == Q.front)
return false;
e = Q.base[Q.front];
return true;
}
//入队
bool SqQueue2Insert(SqQueue2& Q,DataType e)
{
if (Q.rear >= Q.queuesize)
{
Q.base = (DataType*)realloc(Q.base, (Q.queuesize + QUEUE_INCREMENT_SIZE) * sizeof(DataType));
if (!Q.base)
{
cout << "realloc error" << endl;
return false;
}
Q.rear = Q.queuesize;
Q.queuesize += QUEUE_INCREMENT_SIZE;
}
Q.base[Q.rear++] = e;
return true;
}
//出队
bool SqQueue2Delete(SqQueue2& Q, DataType& e)
{
if (Q.rear == Q.front)
return false;
e = Q.base[Q.front];
Q.front++;
return true;
}
//队列的遍历
void SqQueue2Traverse(SqQueue2 Q, void(*visit)(DataType))
{
while (Q.front < Q.rear)
{
visit(Q.base[Q.front++]);
}
cout << endl;
}
void visit(DataType c)
{
cout << " " << c;
}
void main()
{
DataType e0;
SqQueue2 Q;
SqQueue2Init(Q);
cout << "向队列中插入元素为:";
for (int i = 1; i <= 5; i++)
{
SqQueue2Insert(Q,i);
}
SqQueue2Traverse(Q,visit);
cout << "此时队列的长度为:" << SqQueue2Length(Q) << endl;
SqQueue2GetHead(Q,e0);
cout << "队列的队头为:" << e0 << endl;
SqQueue2Delete(Q,e0);
cout << "队头出队后,队列的长度为:" << SqQueue2Length(Q) << endl;
cout << "队头出队后,队列元素为:";
SqQueue2Traverse(Q,visit);
SqQueue2Clear(Q);
cout << "清空队列后,队列的长度为:" << SqQueue2Length(Q) << endl;
system("pause");
}
由程序分析,尽管本程序在队列出队时不需要大量移动元素,但是当队列元素较多进行操作是比较浪费空间
相关文章推荐
- 数据结构之队列顺序表示与实现1
- 数据结构之队列的顺序表示及其实现(循环队列)
- 数据结构学习笔记 --- 队列(循环队列-队列的顺序表示和实现)
- 数据结构(5)——循环队列的顺序表示和实现
- 数据结构学习笔记 --- 队列(循环队列-队列的顺序表示和实现)
- 数据结构 第三章-- 循环队列(队列的顺序表示和实现)
- 请实现一个队列,既可以存放整数,又可以存放字符串。简单的说,队列是一种数据结构,按照先进先出的顺序管理进、出队列的元素
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
- 基本数据结构——队列的顺序表示
- 【数据结构】队列(顺序队列、链队列)的JAVA代码实现
- 数据结构(6) 顺序队列 c++ 模板实现
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
- 数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)
- 《数据结构》线性表的顺序表示和实现
- 数据结构之C++实现顺序队列(SeqQueue)(无主函数)
- 循环队列详解及队列的顺序表示和实现
- 数据结构之队列的链式表示和实现
- 队列的顺序表示及实现,循环队列
- 《循环队列---队列的顺序表示和实现》
- 数据结构-顺序表(2)实验要求以及顺序表的表示与实现