Propósito: comprender la estructura de almacenamiento de la cola del anillo y dominar el diseño de varios algoritmos de cálculo básicos en la cola del anillo.
Contenido: escriba un programa para implementar varias operaciones básicas de la cola de anillo (suponiendo que el tipo de elemento ElemType en la pila es char) y complete las siguientes funciones sobre esta base
(1) Inicializar la cola q;
(2) Determinar si la cola q no está vacía;
(3) Introduzca los elementos a, b y c en secuencia;
(4) Eliminar la cola de un elemento y generar el elemento;
(5) ingrese los elementos d, e, f a su vez;
(6) Salida de la secuencia de dequeue;
(7) Liberar la cola.
Agregue dos funciones más y configure MAXSIZE = 40 al mismo tiempo
1. Función 1: Usa el equipo para convertir un número decimal en un número binario. Datos de prueba: 0,635 (hasta 8 bits reservados)
2. Función 2: use la cola para convertir un número decimal en cualquier número decimal dentro del sistema de base 36 (diez números más 26 letras mayúsculas como base), y el usuario ingresa el número decimal y el sistema base convertido.
Datos de prueba: ¿Cuál es el número convertido de 0.1234567 a base 29?
================================================
1. Definir la estructura de datos de la cola
#include <iostream>
#include <cassert>
using namespace std;
#define MAXSIZE 40
typedef char Elemtype;
struct SqQueue
{
Elemtype data[MAXSIZE];
int front, rear;
};
2. Inicialización de la cola
void InitSqQueue(SqQueue*& q)
{
q = new SqQueue;
q->front = q->rear = 0;
}
3. Destruye la cola
void DestroySqQueue(SqQueue*& q)
{
delete q;
}
4. Determinar si la cola está vacía
La condición de que la cola esté vacía: L->delantero == L->trasero;
bool QueueEmpty(SqQueue* q)
{
return q->front == q->rear;
}
5. Únete al equipo
La condición para que la cola esté llena: (L->rear + 1) % MAXSIZE == L->front
Debido a que la cola es una cola circular, es necesario usar MAXSIZE para el resto, de lo contrario, el puntero de la cola se desbordará.
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. Elimina la cola
bool deQueue(SqQueue*& q, Elemtype& e)
{
if (QueueEmpty(L))
return false;
q->front = (q->front + 1) % MAXSIZE;
e = q->data[q->front];
return true;
}
Debido a que la cola es una cola circular, es necesario usar MAXSIZE para el resto, de lo contrario, el puntero principal se desbordará.
7. Función 1: convertir decimal a binario
Cuando m * 2 > 1, ingrese la cola 1, y m toma la parte decimal;
Cuando m * 2 < 1, ingrese 0, m permanece sin cambios;
Cuando m * 2 == 1, termina la operación.
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. Función 2: convertir decimal a cualquier decimal dentro de 30 hexadecimales
Cuando m > 10, es necesario agregar letras a la cola. Dado que ElemType es char, la conversión se realiza en función del código ASCII de la letra.
Cuando m < 10, se deben agregar números (caracteres) a la cola. Dado que ElemType es char, la conversión se realiza en función del código ASCII de los números (caracteres).
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;
}
}
}
================================================
función principal
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);
}