C语言编程题数组反转

数组反转是编程中一个常见任务,可以使用多种方法实现。在C语言中,有几种方法可以反转数组,每种方法都有其自身的优势和注意事项。五种方法展示了不同的思路和技巧来实现数组的反转,每种方法都有其适用场景和优缺点。

1、双指针法

使用两个指针,一个指向数组的开头,一个指向数组的末尾,然后交换它们的值,直到两个指针相遇。

#include <stdio.h>

void reverseArray(int arr[], int n) {
    int start = 0;
    int end = n - 1;
    while (start < end) {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    reverseArray(arr, n);
    
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

2、递归法

使用递归来反转数组,通过交换第一个元素和最后一个元素,然后递归地处理剩余的子数组。

#include <stdio.h>

void reverseArrayRecursive(int arr[], int start, int end) {
    if (start >= end)
        return;
    
    int temp = arr[start];
    arr[start] = arr[end];
    arr[end] = temp;
    
    reverseArrayRecursive(arr, start + 1, end - 1);
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    reverseArrayRecursive(arr, 0, n - 1);
    
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

3、辅助数组法

使用一个辅助数组来存储原数组的反转版本,然后将辅助数组的值复制回原数组。

#include <stdio.h>

void reverseArrayWithAux(int arr[], int n) {
    int aux[n];
    
    for (int i = 0; i < n; i++) {
        aux[n - 1 - i] = arr[i];
    }
    
    for (int i = 0; i < n; i++) {
        arr[i] = aux[i];
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    reverseArrayWithAux(arr, n);
    
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

4、栈法

使用栈来反转数组,将数组元素依次压入栈中,然后再依次弹出到原数组中。

#include <stdio.h>
#include <stdlib.h>

typedef struct Stack {
    int top;
    unsigned capacity;
    int* array;
} Stack;

Stack* createStack(unsigned capacity) {
    Stack* stack = (Stack*)malloc(sizeof(Stack));
    stack->capacity = capacity;
    stack->top = -1;
    stack->array = (int*)malloc(stack->capacity * sizeof(int));
    return stack;
}

int isFull(Stack* stack) {
    return stack->top == stack->capacity - 1;
}

int isEmpty(Stack* stack) {
    return stack->top == -1;
}

void push(Stack* stack, int item) {
    if (isFull(stack))
        return;
    stack->array[++stack->top] = item;
}

int pop(Stack* stack) {
    if (isEmpty(stack))
        return -1;
    return stack->array[stack->top--];
}

void reverseArrayWithStack(int arr[], int n) {
    Stack* stack = createStack(n);
    
    for (int i = 0; i < n; i++) {
        push(stack, arr[i]);
    }
    
    for (int i = 0; i < n; i++) {
        arr[i] = pop(stack);
    }
    
    free(stack->array);
    free(stack);
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    reverseArrayWithStack(arr, n);
    
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

5、STL库函数

在C++中,可以使用STL中的 reverse 函数来反转数组。在C语言中,我们可以实现类似的功能。

#include <stdio.h>

void reverseArraySTL(int arr[], int n) {
    for (int i = 0; i < n / 2; i++) {
        int temp = arr[i];
        arr[i] = arr[n - 1 - i];
        arr[n - 1 - i] = temp;
    }
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    reverseArraySTL(arr, n);
    
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

推荐阅读
cjavapy编程之路首页