1.1 数组逆置(C语言实现)

目录

     第一步:分析问题,找到解决问题的思路

     第二步:选取中心点

     第三步:元素交换

     第四步:双指针遍历数组

     第五步:代码实现

     测试结果:

     总结:


数组是一种常见的容器,本次我们练习一下数组逆置问题。

在解决问题之前,我们第一步是要明确问题是什么,然后思考解决问题的方法,最后写代码进行实现

第一步:分析问题,找到解决问题的思路

由上图可以分析,数组逆置需要将中心点两边的元素进行交换 。

那么这又延伸出两个问题,如何选取中心点?如何交换两个元素?

第二步:选取中心点

一个数组的元素个数 n 要么是奇数,要么是偶数,这里我们分情况继续分析。

1.如果是奇数,那么中间点的数组下标就是 n / 2   。比如说n=  5,那么  5 / 2 =2,我们需要交换两次;

需要交换(a[0],a[4] )、(a[1],a[3])      // 括号中左面一个元素没有到达中心点  a[2]

2.如果是偶数,中心点依旧 是 n / 2 。比如说n=  4,4 /2 =2;需要交换两次;

需要交换(a[0],a[3] )、(a[1],a[2])     //括号中左面一个元素没有到达中心点    a[2]

由此我们得出,中心点的位置为  n  /  2  ;并且交换的次数为中心点的下标数 n  /  2       (n为数组元素个数)  

第三步:元素交换

根据已经学过的知识,交换两个元素需要用指针,这样才不会交换两个数的副本(即无效交换)

void  swap (int *num1,int *num2){


int temp;

temp=*num_one;//存放num_one的中间变量

*num_one=*num_two;

*num_two=temp;

}

第四步:双指针遍历数组

有了交换两个数的方法,那么我们怎么遍历整个数组呢,或者说怎么样快速高效的将中心点两边的所有元素进行交换呢?

这里我们使用双指针的方法,所谓双指针是指一个指针 i 指向数组的开头,另一个指针 指向数组的末尾。

我们让 i  不断自增,让j不断自减,直到   到达数组中间点的前一个位置,这表示已经全部交换完毕

 

第五步:代码实现

终于到了最激动人心的环节了,根据我们以上分析出来的思路,现在开始码代码

#include <stdio.h>

void swap (int *num1,int *num2){  //交换两个元素的函数
    
    int temp;
    temp=*num1;
    *num1=*num2;
    *num2=temp;
      
}

//逆置函数

void   reverseArray(int *array,int num)//num为数组元素个数

{
    
     int * half=array + num / 2;  // 数组中间点
     int * i=array;        //头指针
     int * j=array+num-1;    //尾指针
     while(i<half){
       swap(i,j);
       i++,j--;
     }

}

int main(){

    int a[10],n;   //n为数组元素个数
    scanf("%d",&n);

    printf("逆置前:\n");
    for(int i=0;i<n;i++)
        scanf("%d",a+i);
    reverseArray(a,n);
    printf("逆置后:\n");
    for(int i=0;i<n;i++)
        printf("%d  ",*(a+i));
    return 0;
}

测试结果:

当  n  为奇数

当  n  为偶数

总结:

虽说程序并不复杂,但是也需要我们很细心的分析问题,找到解决问题的思路,这里用到了一些指针运算,加固我们对指针的理解。

 

在C语言中,我们可以使用栈的数据结构来一个数组的元素。栈是一种后进先出(LIFO)的数据结构,这意味着最后放入的元素会最先弹出。以下是一个简单的步骤描述和示例代码: 1. 创建一个空的栈。 2. 遍历数组,依次将每个元素压入栈中。 3. 再次遍历数组,从栈顶弹出元素并将其放回原数组的位,即倒序位。 以下是C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #define SIZE 5 // 示例数组大小 void push(int stack[], int top, int value) { if (top >= SIZE - 1) { printf("Stack is full.\n"); return; } stack[top] = value; top++; } int pop(int stack[], int *top) { if (*top == -1) { printf("Stack is empty.\n"); return -1; } int value = stack[*top]; stack[*top] = -1; // 标记栈顶已清空 (*top)--; return value; } void reverse_array(int arr[], int n) { int stack[SIZE]; // 假设数组不大于预设的SIZE int top = -1; // 入栈 for (int i = 0; i < n; i++) { push(stack, &top, arr[i]); } // 出栈并反转数组 for (int i = 0; i < n; i++) { arr[i] = pop(stack, &top); } } // 测试 int main() { int arr[] = {1, 2, 3, 4, 5}; int n = sizeof(arr) / sizeof(arr[0]); printf("Original array: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } reverse_array(arr, n); printf("\nReversed array: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` 当你运行这个程序,它会输入的数组。注意,这个实现假设栈的大小已经预先设定好,并且不会处理动态扩容的问题。在实际应用中,你可能需要一个动态大小的栈或者其他数据结构来处理任意大小的数组
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少年与云眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值