C++学习---队列的构建及操作

一、循环队列

 

#include <iostream>
using namespace std;
#define MAXQSIZE 100
typedef struct {
    int* base;//存储空间的基地址
    int front;//头指针
    int rear;//尾指针
}SqQueue;

//初始化队列  构造一个空队列Q
void InitQueue(SqQueue& Q) {
    Q.base = new int[MAXQSIZE];//为队列分配一个最大容量为MAXQSIZE的数组空间
    if (!Q.base) exit(OVERFLOW);//存储分配失败
    Q.front = Q.rear = 0;//将0赋值给头指针和尾指针,表示队列为空
}
//入队,e为插入的元素
bool EnQueue(SqQueue& Q, int e) {
    if ((Q.rear + 1) % MAXQSIZE == Q.front) return false;//尾指针在循环意义上加1后等于头指针,表示队满
    Q.base[Q.rear] = e;//e插入队尾
    Q.rear = (Q.rear + 1) % MAXQSIZE;//队尾指针加1.如果超过100则从0重新计数
    return true;
}
//出队,删除队列Q的队头元素,用e返回其值
bool DeQueue(SqQueue& Q, int &e) {
    if (Q.front == Q.rear) return false;//队空
    e = Q.base[Q.front];//将队头元素赋值给e
    Q.front = (Q.front + 1) % MAXQSIZE;//队头指针加一
    return true;
}
//取队头元素
int GetHead(SqQueue Q) {
    //当队列不为空时,返回队列头元素
    if (Q.front != Q.rear)
        return Q.base[Q.front];
	return NULL;
}
//返回队列Q的元素个数
int QueueLength(SqQueue Q) {
    return(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
//批量入队(这里默认不会超过最大元素数MAXQSIZE)
void QueueInput(SqQueue& Q) {
	int value;//用户输入的值
	int n = 0;//输入数据的个数
	cout << "你想要输入几个数据?" << endl;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cout << "请输入第" << i + 1 << "个数据:";
		cin >> value;//输入元素值
		if(EnQueue(Q,value)) cout << "入队成功!" << endl;
		else cout << "入队失败!";
	}
}
//依次出队
void QueueOut(SqQueue& Q) {
	int value;
	cout << "依次出队的值为:\n";
	while (DeQueue(Q, value))
		cout << value<<"\t";
}

int main()
{
	int opearateNum = 0;//操作值
	SqQueue Q;
	InitQueue(Q);
	while (true)
	{
		cout << "1、批量入队\t2、全部依次出队\t3、取队头元素值\t4、出队\t5、队列元素个数\t6、退出" << endl;
		cin >> opearateNum;
		if (opearateNum == 6)
			break;
		switch (opearateNum)
		{
		case 1:
			//数据输入
			QueueInput(Q);
			system("pause");
			system("cls");
			break;
		case 2:
			//依次出队
			QueueOut(Q);
			system("pause");
			system("cls");
			break;
		case 3:
			if (Q.rear == Q.front)
				cout << "队列无元素" << endl;
			else
				cout << "队头元素值为:" << GetHead(Q) << endl;
			system("pause");
			system("cls");
			break;
		case 4:
			int value;//出队的值
			cout << "出队的元素值为:";
			if (!DeQueue(Q,value))
				cout << "队列无元素!" << endl;
			else
				cout << value << endl;
			system("pause");
			system("cls");
			break;
		case 5:
			cout << "队列共有" << QueueLength(Q) << "个元素" << endl;
			system("pause");
			system("cls");
			break;
		default:
			cout << "无效操作,请重新输入!" << endl;
			break;
		}

	}
}

 

  二、链队

 

#include <iostream>
using namespace std;

typedef struct QNode {
    int data;
    struct QNode* next;
}*QueuePtr;
typedef struct {
    QueuePtr front;//队头指针
    QueuePtr rear;//队尾指针
}LinkQueue;

//初始化队列   构造空的队列
void InitQueue(LinkQueue& Q) {
    Q.front = Q.rear = new QNode;//生成新结点作为头结点,队头和队尾指针指向此结点
    Q.front->next = NULL;//头结点的指针域置空
}

//入队   插入元素e为队列Q的新的队尾元素
bool EnQueue(LinkQueue& Q, int e) {
    QNode* p = new QNode;//为入队元素分配结点空间,用指针p指向
    p->data = e;//将新结点数据域置为e
    p->next = NULL;
    Q.rear->next = p;//将新结点插入到队尾
    Q.rear = p;//修改队尾指针
    return true;
}

//出队  删除队列Q的队头元素,用e返回其值
bool DeQueue(LinkQueue& Q, int &e) {
    if (Q.front == Q.rear) return false;//若队列为空,则返回false
    QNode* p = Q.front->next;//生成新结点p指向队头元素
    e = p->data;//e保存队头元素的值
    Q.front->next = p->next;//修改头结点的指针域
    if (Q.rear == p) Q.rear = Q.front;//如果只有一个元素则将队尾指针指向头结点
    delete p;//释放队头元素的空间
    return true;
}

//取队头元素
int GetHead(LinkQueue Q) {
    if (Q.front != Q.rear)//队列不为空
        return Q.front->next->data;//返回队头元素的值
}

//批量入队(这里默认不会超过最大元素数MAXQSIZE)
void QueueInput(LinkQueue& Q) {
	int value;//用户输入的值
	int n = 0;//输入数据的个数
	cout << "你想要输入几个数据?" << endl;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cout << "请输入第" << i + 1 << "个数据:";
		cin >> value;//输入元素值
		if (EnQueue(Q, value)) cout << "入队成功!" << endl;
		else cout << "入队失败!";
	}
}
//依次出队
void QueueOut(LinkQueue& Q) {
	int value;
	cout << "依次出队的值为:\n";
	while (DeQueue(Q, value))
		cout << value << "\t";
}
int main()
{
	int opearateNum = 0;//操作值
	LinkQueue Q;
	InitQueue(Q);
	while (true)
	{
		cout << "1、批量入队\t2、全部依次出队\t3、取队头元素值\t4、出队\t5、入队\t6、退出" << endl;
		cin >> opearateNum;
		if (opearateNum == 6)
			break;
		switch (opearateNum)
		{
		case 1:
			//数据输入
			QueueInput(Q);
			system("pause");
			system("cls");
			break;
		case 2:
			//依次出队
			QueueOut(Q);
			system("pause");
			system("cls");
			break;
		case 3:
			if (Q.rear == Q.front)
				cout << "队列无元素" << endl;
			else
				cout << "队头元素值为:" << GetHead(Q) << endl;
			system("pause");
			system("cls");
			break;
		case 4:
			int value;//出队的值
			cout << "出队的元素值为:";
			if (!DeQueue(Q,value))
				cout << "队列无元素!" << endl;
			else
				cout << value << endl;
			system("pause");
			system("cls");
			break;
		case 5:
			int e;//用户输入的值
			cout << "请输入入队的值:";
			cin >> e;
			if (EnQueue(Q, e))
				cout << "入队成功!" << endl;
			else
				cout << "入队失败!" << endl;
			system("pause");
			system("cls");
			break;
		default:
			cout << "无效操作,请重新输入!" << endl;
			break;
		}

	}
}

 

  

 

 

posted @ 2020-10-08 14:25  edl李曉宇  阅读(896)  评论(0编辑  收藏  举报