C语言实验——数组逆序

C语言实验——数组逆序

Time Limit: 1000MS Memory limit: 65536K

题目描述

有n个整数,使其最后m个数变成最前面的m个数,其他各数顺序向后移m(m < n < 100)个位置。

输入

输入数据有2行,第一行的第一个数为n,后面是n个整数,第二行整数m。

输出

按先后顺序输出n个整数。

示例输入

 

5 1 2 3 4 5

2

示例输出

4 5 1 2 3
  • 这个是比较简单的一道题吧,不过现在正在学数据结构,于是这道题也用栈做了一遍

    <div style="text-align: justify;">#include<stdio.h>
    #include<stdlib.h>
    #define stackmax 1000
    #define stacknum 1000
    typedef struct
    {
        int *top;
        int *base;
        int stacksize;
    }stack;
    int initstack(stack &s)
    {
        s.base = (int *)malloc(stackmax*sizeof(int));
        if(!s.base) exit(-1);
        s.top = s.base;
        s.stacksize = stackmax;
        return 0;
    }
    void push(stack &s,int e)
    {
        if(s.top - s.base >= s.stacksize)
        {
            s.base = (int *)realloc(s.base,(stacknum + s.stacksize)*sizeof(int));
            if(!s.base) exit(-1);
            s.top = s.base + s.stacksize;
            s.stacksize += stacknum;
        }
        s.top++;
        *s.top = e;
    }
    void pop(stack &s)
    {
        printf("%d ",*s.top);
        s.top--;
    }
    void inverse(int a[],int n,int m)
    {
        stack s;
        initstack(s);
        for(int i = 1;i <= m;i++)
        {
            push(s,a[n-i]);
        }
        for(int i = 0;i < m;i++)
        {
            pop(s);
        }
        for(int i = 0;i < n-m-1;i++)
        {
            printf("%d ",a[i]);
        }
        printf("%d\n",a[n-m-1]);
    }
    int main()
    {
        int n,m;
        int a[100];
        scanf("%d",&n);
        for(int i = 0;i < n;i++)
            scanf("%d",&a[i]);
        scanf("%d",&m);
        if(m == n)
        {
            for(int i = 0;i < n-1;i++)
                printf("%d ",a[i]);
            printf("%d",a[n-1]);
        }
        else
        inverse(a,n,m);
        return 0;
    }
    </div>
### C语言数组逆序存放的实现方法 在C语言中,可以通过多种方式实现数组逆序存放。以下是几种常见的实现方法及其解释: #### 方法一:手动交换法 通过定义一个函数来完成数组元素的手动交换操作。这种方法的核心思想是使用两个指针分别指向数组的起始位置和结束位置,逐步向中间靠拢并交换对应的元素。 ```c #include <stdio.h> void reverseArray(int *arr, int size) { int temp; for (int i = 0, j = size - 1; i < j; ++i, --j) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int main() { int n; printf("请输入需要存储数的个数:"); scanf("%d", &n); int array[n]; printf("请依次输入 %d 个整数:\n", n); for (int i = 0; i < n; ++i) { scanf("%d", &array[i]); } reverseArray(array, n); printf("逆序后的数组为:\n"); for (int i = 0; i < n; ++i) { printf("%d ", array[i]); } printf("\n"); return 0; } ``` 此代码实现了数组的原地逆序功能[^1]。 --- #### 方法二:逐个打印逆序 如果不需要实际修改原始数组的内容,而是仅需按照逆序的方式输出数据,则可以直接从数组末尾向前遍历并逐一打印。 ```c #include <stdio.h> int main() { int a[] = {1, 2, 3, 4, 5}; int length = sizeof(a) / sizeof(a[0]); printf("逆序输出为:\n"); for (int i = length - 1; i >= 0; --i) { printf("%d ", a[i]); } printf("\n"); return 0; } ``` 这种方式适用于只需要展示逆序效果而无需改变原有数组的情况[^2]。 --- #### 方法三:借助辅助数组 创建一个新的数组用于保存源数组中的元素,并以相反顺序填充新数组。最后可以选择覆盖原来的数组或者单独处理新的数组。 ```c #include <stdio.h> #define MAX_SIZE 100 int main() { int original[MAX_SIZE], reversed[MAX_SIZE]; int n; printf("请输入数组大小(不超过%d):", MAX_SIZE); scanf("%d", &n); if (n > MAX_SIZE || n <= 0) { printf("错误:超出允许范围。\n"); return 1; } printf("请输入 %d 个整数:\n", n); for (int i = 0; i < n; ++i) { scanf("%d", &original[i]); } // 构建逆序数组 for (int i = 0; i < n; ++i) { reversed[i] = original[n - 1 - i]; } printf("逆序后的数组为:\n"); for (int i = 0; i < n; ++i) { printf("%d ", reversed[i]); } printf("\n"); return 0; } ``` 该方案适合于不允许直接修改原始数据的应用场景[^4]。 --- #### 方法四:利用标准库函数(C++扩展) 虽然严格意义上这是属于C++的标准库支持,但如果项目环境兼容C++特性的话也可以考虑采用`std::reverse()`这样的高效工具简化开发流程。 ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ vector<int> vec = {8, 6, 5, 4, 1}; reverse(vec.begin(), vec.end()); cout << "Reverse Array: "; for(auto elem : vec){ cout << elem << ' '; } return 0; } ``` 注意这实际上超出了纯C范畴进入了C++领域[^3]。 --- ### 总结 以上介绍了四种不同的技术路线来达成同样的目标——即让给定的一维线性表结构内的成员呈现镜像排列状态。每种途径都有其适用背景以及优缺点所在,在具体选用时应综合考量诸如性能需求、内存消耗等因素后再做决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值