C++ réalise le fonctionnement de base de la file d'attente en anneau (conversion décimale décimale)

Objectif : Comprendre la structure de stockage de la file d'attente en anneau et maîtriser la conception de divers algorithmes de calcul de base dans la file d'attente en anneau.

Contenu : écrivez un programme pour implémenter diverses opérations de base de la file d'attente en anneau (en supposant que le type d'élément ElemType dans la pile est char), et complétez les fonctions suivantes sur cette base

(1) Initialiser la file d'attente q ;

(2) Déterminer si la file d'attente q n'est pas vide ;

(3) Entrez les éléments a, b et c dans l'ordre ;

(4) retirer un élément de la file d'attente et produire l'élément ;

(5) saisir tour à tour les éléments d, e, f ;

(6) Sortir la séquence de retrait de la file d'attente ;

(7) Libérez la file d'attente.

Ajoutez deux autres fonctions et définissez MAXSIZE=40 en même temps

     1. Fonction 1 : Utilisez l'équipe pour convertir un nombre décimal en un nombre binaire. Données de test : 0,635 (jusqu'à 8 bits réservés)

     2. Fonction 2 : Utilisez la file d'attente pour convertir un nombre décimal en n'importe quel nombre décimal dans le système à 36 bases (dix nombres plus 26 lettres majuscules comme base), et le nombre décimal et le système de base converti sont entrés par l'utilisateur.  

       Données de test : Quel est le nombre converti de 0,1234567 en base 29 ?

================================================

1. Définir la structure de données de la file d'attente

#include <iostream>
#include <cassert>
using namespace std;
#define MAXSIZE 40
typedef char Elemtype;
struct SqQueue
{
	Elemtype data[MAXSIZE];
	int front, rear;
};

2. Initialisation de la file d'attente

void InitSqQueue(SqQueue*& q)
{
	q = new SqQueue;
	q->front = q->rear = 0;
}

 3. Détruire la file d'attente

void DestroySqQueue(SqQueue*& q)
{
	delete q;
}

 4. Déterminez si la file d'attente est vide

La condition que la file d'attente soit vide : L->avant == L->arrière ;

bool QueueEmpty(SqQueue* q)
{
	return q->front == q->rear;
}

5. Rejoignez l'équipe

La condition pour que la file d'attente soit pleine : (L->arrière + 1) %MAXSIZE == L->avant

Parce que la file d'attente est une file d'attente circulaire, il est nécessaire d'utiliser MAXSIZE pour le reste, sinon le pointeur de queue débordera.

bool enQueue(SqQueue*& q, Elemtype e)
{
	if ((q->rear + 1) % MAXSIZE == q->front)
		return false;
	q->rear = (q->rear + 1) % MAXSIZE;
	q->data[q->rear] = e;
	return true;
}

6. Retirer de la file d'attente

bool deQueue(SqQueue*& q, Elemtype& e)
{
	if (QueueEmpty(L))
		return false;
	q->front = (q->front + 1) % MAXSIZE;
	e = q->data[q->front];
	return true;
}

Parce que la file d'attente est une file d'attente circulaire, il est nécessaire d'utiliser MAXSIZE pour le reste, sinon le pointeur de tête débordera.

7. Fonction 1 : convertir décimal en binaire

Lorsque m * 2 > 1, entrez la file d'attente 1, et m prend la partie décimale ;

Lorsque m * 2 < 1, entrez 0, m reste inchangé ;

Lorsque m * 2 == 1, terminer l'opération.

void change1(SqQueue*& q, double m,int n)//m为测试数据,n为保留的位数
{
	for (int i = 1; i <= n; i++)
	{
		m = m * 2;
		if (m > 1)
		{
			if (!enQueue(q, 1))
				cout << "插入失败";
			m = m - 1;
		}
		else if (m < 1)
		{
			if (!enQueue(q, 0))
				cout << "插入失败";
		}
		else if (m == 1)
		{
			if (!enQueue(q, 1))
				cout << "插入失败";
			break;
		}
	}
}

 8. Fonction 2: convertir décimal en n'importe quel décimal dans les 30 hexadécimaux

Lorsque m > 10, des lettres doivent être ajoutées à la file d'attente. Puisque l'ElemType est char, la conversion est effectuée en fonction du code ASCII de la lettre.

Lorsque m < 10, des nombres (caractères) doivent être ajoutés à la file d'attente. Puisque l'ElemType est char, la conversion est effectuée en fonction du code ASCII des nombres (caractères).

void change2(SqQueue*& q,double m, double n)//m为测试数据,n为转换的进制
{
	for (int i = 1; i <= 10;i++)//保留十位小数;
	{
		int a;
		m = m * n;
		if (m > 10)
		{
			a = (int)m + 55;//a的最小值为65,A的ASCII码为65;
			if (!enQueue(q,a))
				cout << "插入失败";
			m = m - (int)m;
		}
		else
		{
			a=(int)m + 48;//a的最小值为0,'0'的ASCII码为48;
			if (!enQueue(q,a))
				cout << "插入失败";
			m = m - (int)m;
		}
	}
}

================================================

fonction principale

int main()
{
	SqQueue *Q;
	ElemType e;
	ElemType a[MAXSIZE] = { 'a','b','c' };
	ElemType b[MAXSIZE] = { 'd','e','f' };

	cout << "1.初始化队列q" << endl;
	InitQueue(Q);

	cout << "2.判断队列q是否非空" << endl;
	if (!QueueEmpty(Q))
		cout << "队列q不为空" << endl;
	else
		cout << "队列q为空" << endl;

	cout << "3.依次进队元素a、b、c" << endl;
	for (int i = 0; i < 3; i++)
		if (!enQueue(Q,a[i]))
			cout << "插入失败" << endl;

	cout << "4.出队一个元素,输出该元素" << endl;
	if (deQueue(Q, e))
		cout << "出队的元素为" << (char)e << endl;

	cout << "5.依次进队元素d、e、f" << endl;
	for (int i = 0; i < 3; i++)
		if (!enQueue(Q, b[i]))
			cout << "插入失败" << endl;

	cout << "6.输出出队序列" << endl;
	while (!QueueEmpty(Q))
	{
		if (deQueue(Q, e))
			cout << (char)e << '\t';
	}
	cout << endl;

	cout << "7.释放队列" << endl;
	DestroyQueue(Q);

	cout << "函数1的实现" << endl;
	SqQueue* L1;
	InitQueue(L1);
	change1(L1, 0.635, 8);
	cout << "0.";
	while (!QueueEmpty(L1))
	{
		if (deQueue(L1, e))
			cout << e;
	}
	DestroyQueue(L1);
	cout << endl;

	cout << "函数2的实现" << endl;
	SqQueue* L2;
	InitQueue(L2);
	cout << "请输入测试数据:"; double k; cin >> k;
	cout << "请输入转换的进制:"; double j; cin >> j;
	change2(L2,k,j);
	cout << "0.";
	while (!QueueEmpty(L2))
	{
		if (deQueue(L2, e))
			cout << (char)e;
	}
	DestroyQueue(L2);
}

Je suppose que tu aimes

Origine blog.csdn.net/henry594xiaoli/article/details/125624769
conseillé
Classement