顺序表ADT模板设计及简单应用:将顺序表中前 m 个元素和后 n 个元素进行互换

顺序表ADT模板设计及简单应用:将顺序表中前 m 个元素和后 n 个元素进行互换

作者: 冯向阳时间限制: 1S章节: DS:线性表

截止日期: 2022-06-30 23:55:00

问题描述 :

目的:使用自行设计的顺序表ADT或STL中的vector模板,设计并实现顺序表应用场合的一些简单算法设计。

应用1:试设计一个算法,用尽可能少的辅助空间将非空顺序表中前 m 个元素和后 n 个元素进行互换,即将线性表(a1,a2,…,am,b1,b2,…,bn) 改变成(b1,b2,…,bn,a1,a2,…,am)。假定m始终是有效值。

参考函数原型:

(1)顺序表ADT版本

template<class ElemType>

void Exchange( SqList<ElemType> &A, int m ); // 本算法实现顺序表中前 m 个元素和后 n 个元素的互换

(2)vector版本

template<class ElemType>
void Exchange( vector<ElemType> &A, int m );// 本算法实现顺序表中前 m 个元素和后 n 个元素的互换

输入说明 :

第一行:顺序表的数据元素类型标记(0:int;1:double;2:char;3:string;其余值:输出err)

第二行:待处理顺序表的数据元素(数据元素之间以空格分隔)

第三行:逆置位置m

输出说明 :

第一行:逆置前顺序表的遍历结果(数据元素之间以“,”分隔)

空行

第三行:逆置后顺序表的遍历结果(数据元素之间以“,”分隔)

输入范例 :

0
13 5 27 9 32 123 76 98 54 87
5

输出范例 :

13,5,27,9,32,123,76,98,54,87

123,76,98,54,87,13,5,27,9,32


AC代码:

#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
template<class ElemType>
void Exchange( vector<ElemType> &A, int m )
{
    int n=A.size()-m;
    reverse(A.begin(),A.end());
    reverse(A.begin(),A.begin()+n);
    reverse(A.begin()+n,A.end());
}
int main()
{
    int Type,m;
    string str;
    cin>>Type;
    getchar();
    if(Type!=0&&Type!=1&&Type!=2&&Type!=3)
    {
        cout<<"err"<<endl;
        return 0;
    }
    else if(Type==0)
    {
        int num1=0;
        getline(cin,str);
        cin>>m;
        vector<int>a;
        for (int i=0; i<str.size(); i++)
        {
            if (str[i]==' ')
            {
                a.push_back(num1);
                num1=0;
            }
            else
            {
                num1=num1*10+str[i]-'0';
            }
        }
        a.push_back(num1);

        for(int i=0; i<a.size(); i++)
        {
            if(i==a.size()-1)
            {
                cout<<a[i];
            }
            else cout<<a[i]<<',';
        }
        cout<<endl;
        cout<<endl;
        Exchange(a,m);

        for(int i=0; i<a.size(); i++)
        {
            if(i==a.size()-1)
            {
                cout<<a[i];
            }
            else cout<<a[i]<<',';
        }
    }
    else if(Type==1)
    {
        getline(cin,str);
        double num2=0.0,sum=0.0;
        int flag=0,t=0;
        cin>>m;
        vector<double>b;
        for(int i=0; i<str.size(); i++)
        {
            if(str[i]==' ')
            {
                int k=1;
                for(int j=0;j<t;j++)
                {
                    k*=10;
                }
                num2/=k;
                b.push_back(num2);
                num2=0.0;
                flag=0;
                t=0;
            }
            else if(str[i]=='.')
            {
                flag=1;
            }
            else
            {
                num2=num2*10+str[i]-'0';
                if(flag==1)
                {
                    t++;
                }
            }
        }
        int k=1;
        for(int j=0;j<t;j++)
        {
            k*=10;
        }
        num2/=k;
        b.push_back(num2);

        for(int i=0; i<b.size(); i++)
        {
            if(i==b.size()-1)
            {
                cout<<b[i];
            }
            else cout<<b[i]<<',';
        }
        cout<<endl;
        cout<<endl;
        Exchange(b,m);
        for(int i=0; i<b.size(); i++)
        {
            if(i==b.size()-1)
        {
            cout<<b[i];
        }
           else cout<<b[i]<<',';
        }
        cout<<endl;
    }
    else if(Type==2)
    {
        getline(cin,str);
        cin>>m;
        vector<char> c;
        char CH;
        for(int i=0; i<str.size(); i++)
        {
            CH=str[i];
            if(CH!=' ')
            {
                c.push_back(CH);
            }
        }
        for(int i=0; i<c.size(); i++)
        {
            if(i==c.size()-1)
            {
                cout<<c[i];
            }
            else cout<<c[i]<<',';
        }
        cout<<endl;
        cout<<endl;
        Exchange(c,m);
        for(int i=0; i<c.size(); i++)
        {
           if(i==c.size()-1)
            {
                cout<<c[i];
            }
            else cout<<c[i]<<',';
        }
        cout<<endl;
    }
    else if(Type==3)
    {
        getline(cin,str);
        cin>>m;
        vector<string>d;
        string p;
        p="";
        p.clear();
        for(int i=0; i<str.size(); i++)
        {
            if(str[i]==' ')
            {
                d.push_back(p);
                p.clear();
            }
            else
            {
                p+=str[i];
            }
        }
        d.push_back(p);
        for(int i=0; i<d.size(); i++)
        {
            if(i==d.size()-1)
            {
                cout<<d[i];
            }
            else cout<<d[i]<<',';
        }
        cout<<endl;
        cout<<endl;
        Exchange(d,m);
        for(int i=0; i<d.size(); i++)
        {
            if(i==d.size()-1)
            {
                cout<<d[i];
            }
            else cout<<d[i]<<',';
        }
    }
    return 0;
}

顺序表ADT模板设计: 1. 定义顺序表结构体,包含元素数组和当前元素个数等信息。 2. 初始化顺序表,分配元素数组空间,将当前元素个数置为。 3. 插入元素,判断是否已满,若未满则在末尾插入元素并更新当前元素个数。 4. 删除元素,判断是否为空,若非空则删除指定位置的元素并更新当前元素个数。 5. 获取元素,判断是否越界,若未越界则返回指定位置的元素。 6. 修改元素,判断是否越界,若未越界则修改指定位置的元素。 7. 互换元素,将顺序表中前m个元素和后n个元素进行互换,需要先判断m和n是否合法,然后使用一个临时数组进行交换。 简单应用: 假设有一个顺序表L,其有10个元素,需要将前3个元素和后4个元素进行互换,可以按照以下步骤实现: 1. 判断m和n是否合法,即m+n是否等于L元素个数。 2. 创建一个临时数组temp,将前m个元素复制到temp。 3. 将后n个元素依次移动到前m个元素的位置上。 4. 将temp的元素依次移动到后n个元素的位置上。 5. 更新顺序表L的当前元素个数。 代码示例: ``` #define MAXSIZE 100 // 定义顺序表最大长度 typedef struct { int data[MAXSIZE]; // 元素数组 int length; // 当前元素个数 } SqList; // 初始化顺序表 void InitList(SqList *L) { L->length = ; } // 插入元素 void Insert(SqList *L, int pos, int x) { if (L->length == MAXSIZE) { printf("List is full.\n"); return; } if (pos < 1 || pos > L->length + 1) { printf("Invalid position.\n"); return; } for (int i = L->length; i >= pos; i--) { L->data[i] = L->data[i - 1]; } L->data[pos - 1] = x; L->length++; } // 删除元素 void Delete(SqList *L, int pos) { if (L->length == ) { printf("List is empty.\n"); return; } if (pos < 1 || pos > L->length) { printf("Invalid position.\n"); return; } for (int i = pos; i < L->length; i++) { L->data[i - 1] = L->data[i]; } L->length--; } // 获取元素 int GetElem(SqList *L, int pos) { if (pos < 1 || pos > L->length) { printf("Invalid position.\n"); return -1; } return L->data[pos - 1]; } // 修改元素 void SetElem(SqList *L, int pos, int x) { if (pos < 1 || pos > L->length) { printf("Invalid position.\n"); return; } L->data[pos - 1] = x; } // 互换元素 void Swap(SqList *L, int m, int n) { if (m + n != L->length) { printf("Invalid parameters.\n"); return; } int temp[m]; for (int i = ; i < m; i++) { temp[i] = L->data[i]; } for (int i = ; i < n; i++) { L->data[i] = L->data[m + i]; } for (int i = ; i < m; i++) { L->data[n + i] = temp[i]; } L->length = m + n; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值