沈师PTA|数据结构期末考试编程题

前言:本文章的代码均为本人在学习过程中根据书上的代码所改的,主要也是为了应对考试,可能有的题用数组就完成了,发出去的初衷也是希望供同学们参考、学习(功德加11111……)关于链表,我认为只要掌握了前插法和尾插法并能灵活掌握,完成pta不是什么难题(它只是代码长了一点)

顺序表

7-1 顺序表的建立及遍历

#include <iostream>

using namespace std;

int main(){

    int n;

    cin>>n;

    int a[n];

    for(int i=0;i<n;i++){

        cin>>a[i];

        if(i!=n-1)

            cout<<a[i]<<" ";

        else cout<<a[i];

    }

}

7-2 jmu-ds-顺序表区间元素删除

#include <iostream>

using namespace std;

int main(){

    int n;

    cin>>n;

    int a[n];

    for(int i=0;i<n;i++){

        cin>>a[i];

    }

    int x,y;

    cin>>x>>y;

    bool flag=0;

    for(int i=0;i<n;i++){

        if((a[i]<x||a[i]>y)&&flag==1)

            cout<<" "<<a[i];

        else if(a[i]<x||a[i]>y){

            flag=1;

            cout<<a[i];

        }

    }

    return 0;

}

7-3 数组循环左移

#include <iostream>

using namespace std;

int main(){

    int n,m;

    cin>>n>>m;

    int a[n];

    for(int i=0;i<n;i++){

        cin>>a[i];

    }

    for(int i=0;i<m;i++){

        int a1=a[0];

        for(int j=1;j<n;j++){

            a[j-1]=a[j];

        }

        a[n-1]=a1;

    }

    cout<<a[0];

    for(int i=1;i<n;i++){

        cout<<" "<<a[i];

    }

    return 0;

}

7-4 jmu-ds-简单密码

#include <bits/stdc++.h>

using namespace std;

int main(){

    string s;

    getline(cin,s);

    if(s.size()==0)

        cout<<"NULL";

    for(int i=0;i<s.size();i++){

        if(s[i]>='A'&&s[i]<='E')

            s[i]+=21;

        else if(s[i]>='F'&&s[i]<='Z')

            s[i]-=5;

    }

        cout<<s;

}


7-5 递增有序顺序表的插入

#include <bits/stdc++.h>

using namespace std;

int main(){

    int n;

    cin>>n;

    int a[100];

    for(int i=0;i<n;i++){

        cin>>a[i];

    }

    int x;

    cin>>x;

    a[n]=x;

    sort(a,a+n+1);

    for(int i=0;i<n+1;i++){

        cout<<a[i]<<",";

    }

    return 0;

}

链表

7-6 单链表的创建及遍历

#include <iostream>

using namespace std;

typedef struct LNode{

    int data;

    struct LNode *next;

}LNode,*LinkList;

int InitList(LinkList &L){

    L=new LNode;

    L->next=NULL;

    return 1;

}

void CreatList_R(LinkList &L){

    LNode *r,*p;

    r=L;

    int n;

    cin>>n;

    for(int i=0;i<n;i++){

        p=new LNode;

        cin>>p->data;

        r->next=p;

        r=p;

        p->next=NULL;

    }

}

void PrintList(LinkList &L){

    LNode *p;

    p=L->next;

    while(p){

        if(p->next!=NULL)

            cout<<p->data<<" ";

        else cout<<p->data;

        p=p->next;

    }

}

int main(){

    LinkList L;

    InitList(L);

    CreatList_R(L);

    PrintList(L);

    return 0;

}

7-6 两个有序链表序列的合并

#include <iostream>

using namespace std;

typedef struct LNode{

    int data;

    struct LNode *next;

}LNode,*LinkList;

int InitList(LinkList &L){

    L=new LNode;

    L->next=NULL;

    return 1;

}

void CreatList_R(LinkList &L){

    LNode *r,*p;

    r=L;

    int n;

    cin>>n;

    while(n!=-1){

        p=new LNode;

        p->data=n;

        p->next=NULL;

        r->next=p;

        r=p;

        cin>>n;

    }

}

//尾插法

void MergeList_L(LinkList &la,LinkList &lb,LinkList &lc){

    LNode *pa,*pb,*pc;

    pa=la->next;

    pb=lb->next;

    lc=la;

    pc=lc;

    while(pa&&pb){

        if(pa->data<=pb->data){

            pc->next=pa;

            pc=pa;

            pa=pa->next;

        }

        else{

            pc->next=pb;

            pc=pb;

            pb=pb->next;

        }

    }

    pc->next=pa?pa:pb;

    delete lb;

}

int main(){

    LinkList la,lb,lc;

    InitList(la);

    InitList(lb);

    InitList(lc);

    CreatList_R(la);

    CreatList_R(lb);

    MergeList_L(la,lb,lc);

    LNode *p;

    p=lc->next;

    if(!p)cout<<"NULL";

    while(p){

        if(p->next!=NULL)

            cout<<p->data<<" ";

        else cout<<p->data;

        p=p->next;

    }

    return 0;

}

7-7 两个有序链表序列的交集

#include <iostream>

using namespace std;

typedef struct LNode{

    int data;

    struct LNode *next;

}LNode,*LinkList;

int InitList(LinkList &L){

    L=new LNode;

    L->next=NULL;

    return 1;

}

void CreatList_R(LinkList &L){

    LNode *r,*p;

    r=L;

    int n;

    cin>>n;

    while(n!=-1){

        p=new LNode;

        p->data=n;

        r->next=p;

        r=p;

        p->next=NULL;

        cin>>n;

    }

}

void qiujiaoji(LinkList &la,LinkList &lb,LinkList &lc){

    LNode *pa,*pb,*pc;

    pa=la->next;

    pb=lb->next;

    pc=lc;

    while(pa&&pb){

        if(pa->data<pb->data)

            pa=pa->next;

        else if(pa->data>pb->data)

            pb=pb->next;

        else if(pa->data==pb->data){

            pc->next=pa;//不用再创建结点了,否则内存会超限

            pc=pa;

            pa=pa->next;

            pb=pb->next;

        }

    }

}

void PrintList(LinkList &L){

    LNode *p;

    p=L->next;

    if(!p) cout<<"NULL";

    while(p){

        if(p->next!=NULL)

            cout<<p->data<<" ";

        else cout<<p->data;

        p=p->next;

    }

}

int main(){

    LinkList la,lb,lc;

    InitList(la);

    InitList(lb);

    InitList(lc);

    CreatList_R(la);

    CreatList_R(lb);

    qiujiaoji(la,lb,lc);

    PrintList(lc);

}

7-7 求链式线性表的倒数第K项

#include <iostream>

using namespace std;

typedef struct LNode{

    int data;

    struct LNode *next;

}LNode,*LinkList;

int InitList(LinkList &L){

    L=new LNode;

    L->next=NULL;

    return 1;

}

int CreatList_H(LinkList &L){

    LNode *p;

    int n;

    cin>>n;

    int cnt=0;

    while(n!=-1&&n>=0){

        cnt++;

        p=new LNode;

        p->data=n;

        p->next=L->next;

        L->next=p;

        cin>>n;

    }

    return cnt;

}

void PrintList(LinkList &L,int cnt,int k){

    LNode *p;

    p=L->next;

    if(k>cnt) cout<<"NULL";

    int count=0;

    while(p){

        count++;

        if(count==k){

            cout<<p->data;

            break;

        }

        p=p->next;

    }

}

int main(){

    int k;

    cin>>k;

    LinkList L;

    InitList(L);

    int cnt=CreatList_H(L);

    PrintList(L,cnt,k);

    return 0;

}

7-8 链表倒数n个结点的乘积

#include <iostream>

using namespace std;

typedef struct LNode{

    int data;

    struct LNode *next;

}LNode,*LinkList;

int InitList(LinkList &L){

    L=new LNode;

    L->next=NULL;

    return 1;

}

void CreaList_H(int n,LinkList &L){

    LNode *p;

    for(int i=0;i<n;i++){

        p=new LNode;

        cin>>p->data;

        p->next=L->next;

        L->next=p;

    }

}

void PrintList(LinkList &L,int cnt){

    int chengji=1;

    if(cnt==0)

        cout<<0;

    else{

        LNode *p;

        p=L->next;

        for(int i=0;i<cnt;i++){

            chengji*=p->data;

            p=p->next;

        }

        cout<<chengji;

    }

}

int main(){

    int n;

    cin>>n;

    int cnt;

    cin>>cnt;

    LinkList L;

    InitList(L);

    CreaList_H(n,L);

    PrintList(L,cnt);

    return 0;

}

7-9 在有序链表中插入数据

#include <iostream>

using namespace std;

typedef struct LNode{

    int data;

    struct LNode *next;

}LNode,*LinkList;

int InitList(LinkList &L){

    L=new LNode;

    L->next=NULL;

    return 1;

}

void CreatList_R(int n,LinkList &L){

    LNode *r,*p;

    r=L;

    for(int i=0;i<n;i++){

        p=new LNode;

        int x;

        cin>>x;

        p->data=x;

        r->next=p;

        r=p;

        p->next=NULL;

    }

}

void InsertList(LinkList &L,int num){

    LNode *p,*s;

    s=new LNode;

    s->data=num;

    p=L;

    while(p){

        if(p->next==NULL){

            p->next=s;

            p=s;

            s->next=NULL;

            break;

        }

        else if(p->next->data==num) break;

        else if(p->next->data>num){

            s->next=p->next;

            p->next=s;

            break;

        }

        p=p->next;

    }

}

void PrintList(LinkList &L){

    LNode *p;

    p=L->next;

    while(p){

        if(p->next!=NULL)

            cout<<p->data<<" ";

        else cout<<p->data;

        p=p->next;

    }

}

int main(){

    int n;

    cin>>n;

    LinkList l;

    InitList(l);

    CreatList_R(n,l);

    int num;

    cin>>num;

    InsertList(l,num);

    PrintList(l);

    return 0;

}

二分查找

7-12 二分查找

#include <iostream>

using namespace std;

int main(){

    int n;

    cin>>n;

    int arr[n];

    for(int i=0;i<n;i++){

        cin>>arr[i];

    }

    int x;

    cin>>x;

    int cnt=1;

    int index;

    for(int i=0,j=n-1;;cnt++){

        index=(i+j)/2;

        if(x==arr[index]){

            cout<<index<<endl<<cnt;

            break;

        }

        else if(x>arr[index]){

            i=index+1;

        }

        else if(x<arr[index]){

            j=index-1;

        }

        if(i>j){

            cout<<-1<<endl<<cnt;

            break;

        }

    }

}

7-13 二分查找

#include <iostream>

using namespace std;

int erfenchazhao(int arr[],int x,int n){

    int index;

    for(int i=0,j=n-1;;){

        index=(i+j)/2;

        if(arr[index]==x){

            return index;

            break;

        }

        else if(arr[index]<x)

            i=index+1;

        else if(arr[index]>x)

            j=index-1;

        if(i>j) break;

    }

}

int main(){

    int n,m;

    cin>>n>>m;

    int arr[n],b[m];

    for(int i=0;i<n;i++){

        cin>>arr[i];

    }

    for(int i=0;i<m;i++){

        cin>>b[i];

    }

    for(int i=0;i<m;i++){

        if(i!=m-1)

            cout<<erfenchazhao(arr,b[i],n)<<" ";

        else cout<<erfenchazhao(arr,b[i],n);

    }

}}

堆栈

#include <iostream>

#include <string>

using namespace std;

typedef struct{

    char *base;

    char *top;

    int stacksize;

}SqStack;

char InitStack(SqStack &S,int m){

    S.base=new char[m];

    if(!S.base) return 0;

    S.top=S.base;

    S.stacksize=m;

    return 1;

}

char Push(SqStack &S,char &e){

    if(S.top-S.base==S.stacksize) return 0;

    *S.top++=e;

    return 1;

}

char Pop(SqStack &S,char &e){

    if(S.top==S.base) return 0;

    e=*--S.top;

    return 1;

}

bool islegal(string s,int m){

    SqStack stack;

    InitStack(stack,m);

    for(int i=0;i<s.size();i++){

        if(s[i]=='S'){

            if(!Push(stack,s[i]))

                return false;

            //else Push(stack,s[i]);

        }

        

        else if(s[i]=='X'){

                if(!Pop(stack, s[i]))

                   return false;

                //else Pop(stack, s[i]);

       

    }

        else return false;

        

}

    if(stack.top!=stack.base)

        return false;

    return  true;

    

}

int main(){

    int n,m;

    string s;

    cin>>n>>m;

    getchar();

    for(int i=0;i<n;i++){

        getline(cin,s);

        bool flag=islegal(s,m);

        if(flag)

            cout<<"YES"<<endl;

        else cout<<"NO"<<endl;

    }

}

括号匹配

#include <bits/stdc++.h>

#define maxsize 1000

using namespace std;

typedef struct{

    char *top;

    char *base;

    int stacksize;

}Sqstack;

int InitStack(Sqstack &s){

    s.base=new char[maxsize];

    if(!s.base) return 0;

    s.top=s.base;

    s.stacksize=maxsize;

    return 1;

}

char Push(Sqstack &s,char e){

    if(s.top-s.base==s.stacksize) return 0;

    *s.top++=e;

    return 1;

}

char Pop(Sqstack &s){

    if(s.top==s.base) return 0;

    char e=*--s.top;

    return e;

}

bool isMeet(char ch1,char ch2){

    char arr[3]={'(','[','{'};

    if(ch1==arr[0]&&ch2==')')

        return true;

    else if(ch1==arr[1]&&ch2==']')

        return true;

    else if(ch1==arr[2]&&ch2=='}')

        return true;

    else return false;

}

int main(){

    string str;

    getline(cin,str);

    Sqstack s;

    InitStack(s);

    int left=0,right=0;

    bool flag=true;

    for(int i=0;str[i];i++){

        if(str[i]=='('||str[i]=='['||str[i]=='{'){

            left++;

            Push(s,str[i]);

        }

        else if(str[i]==')'||str[i]==']'||str[i]=='}'){

            right++;

            char result=Pop(s);

            flag=isMeet(result,str[i]);

        }

    }

    if(s.top!=s.base)

        flag=false;

    cout<<left<<" "<<right<<endl;

    if(flag)

        cout<<"YES"<<endl;

    else cout<<"NO"<<endl;

}

7-16 字符串对称

#include <bits/stdc++.h>

#define MAXSIZE 1000

using namespace std;

typedef struct{

    char *top;

    char *base;

    int stacksize;

}Sqstack;

int InitStack(Sqstack &s){

    s.base=new char[MAXSIZE];

    if(!s.base) return 0;

    s.top=s.base;

    s.stacksize=MAXSIZE;

    return 1;

}

char Push(Sqstack &s,char e){

    if(s.top-s.base==s.stacksize) return 0;

    *s.top++=e;

    return 1;

}

char Pop(Sqstack &s){

    if(s.top==s.base) return 0;

    char e=*--s.top;

    return e;

}

int main(){

    string str;

    getline(cin,str);

    Sqstack s;

    InitStack(s);

    bool flag=true;

    int l=str.size();

    for(int i=0;i<l/2;i++){

        Push(s,str[i]);

    }

    for(int i=l/2+l%2;i<l;i++){

        if(str[i]!=Pop(s))

            flag=false;

        if(flag==false) break;

    }

    if(flag)

        cout<<"yes";

    else cout<<"no";

}

7-17 数据结构考题 十进制转换为二进制

#include <bits/stdc++.h>

#define MAXSIZE 100

using namespace std;

typedef struct{

    int *top;

    int *base;

    int stacksize;

}Sqstack;

int InitStack(Sqstack &s){

    s.base=new int[MAXSIZE];

    if(!s.base) return 0;

    s.top=s.base;

    s.stacksize=MAXSIZE;

    return 1;

}

int Push(Sqstack &s,int e){

    if(s.top-s.base==s.stacksize) return 0;

    *s.top++=e;

    return 1;

}

int Pop(Sqstack &s){

    if(s.top==s.base) return 0;

    int e=*--s.top;

    return e;

}

int main(){

    int n;

    cin>>n;

    Sqstack s;

    InitStack(s);

    while(n){

        Push(s,n%2);

        n/=2;

    }

    while(s.top!=s.base){

        cout<<Pop(s);

    }

    return 0;

}

7-18 数据结构考题 十进制转换为八进制

#include <bits/stdc++.h>

#define MAXSIZE 1000

using namespace std;

typedef struct{

    int *base;

    int *top;

    int stacksize;

}Sqstack;

int InitStack(Sqstack &s){

    s.base=new int[MAXSIZE];

    if(!s.base) return 0;

    s.top=s.base;

    s.stacksize=MAXSIZE;

    return 1;

}

int Push(Sqstack &s,int e){

    if(s.top-s.base==s.stacksize) return 0;

    *s.top++=e;

    return 1;

}

int Pop(Sqstack &s){

    if(s.top==s.base) return 0;

    int e=*--s.top;

    return e;

}

int main(){

    int n;

    cin>>n;

    Sqstack s;

    InitStack(s);

    while(n){

        Push(s,n%8);

        n/=8;

    }

    while(s.base!=s.top){

        cout<<Pop(s);

    }

    return 0;

}

7-19 队列操作

#include <iostream>

using namespace std;

class MyQueue{

    int Size=0;

    int num[1000000];

    public:

        void Push(int x){

            num[Size++]=x;

        }

        int Pop(){

            return num[--Size];

        }

        int size(){

            return Size;

        }

};

int main(){

    int n;

    cin>>n;

    int operate;

    MyQueue mq;

    for(int i=0;i<n;i++){

        cin>>operate;

        switch(operate){

            case 1:{

                int x;

                cin>>x;

                mq.Push(x);

                break;

            }

            case 2:{

                if(mq.size()==0)

                    cout<<"Invalid"<<endl;

                else cout<<mq.Pop()<<endl;

                break;

            }

            case 3:{

                cout<<mq.size()<<endl;

                break;

            }

        }

    }

    return 0;

}

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有理想的上学人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值