完整C++代码,运用栈设计算法void reverseOdd(SqQueue &sq) ,对参数所给定的队列sq中的整数进行操作,将其中奇数的顺序进行逆置,偶数的顺序维持不变。【样例输入】 6 1 2 3 4 5 6 【样例输出】 5 2 3 4 1 6
时间: 2024-06-03 13:08:03 浏览: 74
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 队列最大长度
typedef int ElemType; // 队列元素类型
typedef struct {
ElemType data[MAXSIZE];
int front; // 队头指针
int rear; // 队尾指针
} SqQueue;
/**
* 初始化队列
* @param Q 队列指针
*/
void initQueue(SqQueue *Q) {
Q->front = Q->rear = 0;
}
/**
* 判断队列是否为空
* @param Q 队列指针
* @return 空返回 1,非空返回 0
*/
int isQueueEmpty(SqQueue *Q) {
return Q->front == Q->rear;
}
/**
* 判断队列是否已满
* @param Q 队列指针
* @return 已满返回 1,未满返回 0
*/
int isQueueFull(SqQueue *Q) {
return (Q->rear + 1) % MAXSIZE == Q->front;
}
/**
* 入队
* @param Q 队列指针
* @param e 入队元素
* @return 入队成功返回 1,失败返回 0
*/
int enQueue(SqQueue *Q, ElemType e) {
if (isQueueFull(Q)) {
return 0;
}
Q->data[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAXSIZE;
return 1;
}
/**
* 出队
* @param Q 队列指针
* @param e 出队元素指针
* @return 出队成功返回 1,失败返回 0
*/
int deQueue(SqQueue *Q, ElemType *e) {
if (isQueueEmpty(Q)) {
return 0;
}
*e = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return 1;
}
/**
* 获取队头元素
* @param Q 队列指针
* @param e 队头元素指针
* @return 获取成功返回 1,失败返回 0
*/
int getHead(SqQueue *Q, ElemType *e) {
if (isQueueEmpty(Q)) {
return 0;
}
*e = Q->data[Q->front];
return 1;
}
/**
* 获取队列长度
* @param Q 队列指针
* @return 队列长度
*/
int getQueueLength(SqQueue *Q) {
return (Q->rear - Q->front + MAXSIZE) % MAXSIZE;
}
/**
* 打印队列元素
* @param Q 队列指针
*/
void printQueue(SqQueue *Q) {
printf("Queue: [");
for (int i = Q->front; i != Q->rear; i = (i + 1) % MAXSIZE) {
printf("%d", Q->data[i]);
if ((i + 1) % MAXSIZE != Q->rear) {
printf(", ");
}
}
printf("]\n");
}
/**
* 将队列中所有奇数位置上的元素翻转
* @param Q 队列指针
*/
void reverseOdd(SqQueue *Q) {
if (isQueueEmpty(Q) || getQueueLength(Q) == 1) { // 队列为空或只有一个元素,不需要翻转
return;
}
SqQueue stack; // 用栈来辅助翻转奇数位置上的元素
initQueue(&stack);
int length = getQueueLength(Q);
for (int i = 1; i <= length; i++) {
ElemType e;
deQueue(Q, &e);
if (i % 2 == 1) { // 奇数位置上的元素入栈
enQueue(&stack, e);
} else { // 偶数位置上的元素直接入队
enQueue(Q, e);
}
}
while (!isQueueEmpty(&stack)) { // 将栈中的元素出栈并入队
ElemType e;
deQueue(&stack, &e);
enQueue(Q, e);
}
}
int main() {
SqQueue Q;
initQueue(&Q);
for (int i = 1; i <= 10; i++) {
enQueue(&Q, i);
}
printQueue(&Q); // 队列: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
reverseOdd(&Q);
printQueue(&Q); // 队列: [1, 10, 3, 8, 5, 6, 7, 4, 9, 2]
return 0;
}
阅读全文