1. 程式人生 > 實用技巧 >C++學習---佇列的構建及操作

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;
		}

	}
}