百花2022年第一次数据结构上机实验

今天早上写的,中午太困了,就拖到晚上啦。这几题写下来的感觉就是好像都写过,都有思路,但是代码写的不是很顺利,应该是有点不熟练了,5555,早知道提醒人美心善的xF复习一下了,昨晚还一起打游戏。

A去除重复字母

题意:意思很简单,就是去除重复字母,然后输出就好了

思路:就是根据题目的意思,前面出现过的就不输出了(本来想着set不就可以去重了嘛,快写完想起来set会自动排序,删了重写!)

emmm,这道题写一个小时的话,呃,说明你真的很执着,想知道你当时的心态hhh,没事的。

知识点:线性表

code:

#include
using namespace std;
 
int main(){
    string a;
    while(cin>>a){
        vectorv;
        int b[30]={0};//标记某个字母是否出现过
        for(int i=0;i

B.简单除法

题意:就是大家都会的除法

思路:注意一下四舍五入就好了

code:

#include
using namespace std;
 
int main(){
    int a,b;
    while(cin>>a>>b){
        if(b==0){
            cout<<"error"<=0.5)cout<

C士兵队列

题意:和约瑟夫环处理差不多,对士兵队列进行若干次遍历,直到最后士兵数不大于3,区别在于:本题每次报数都是从第一个开始,而且出列士兵的序号数会在2和3之间变化。唉,这个是我倒数第二个写出来的题,原因在最后输出队列元素的时候有点问题,我竟然一直没怀疑,找了好久哼。

思路:像约瑟夫环那样模拟一下就好了

知识点:线性表/队列

code:

#include
using namespace std;
typedef long long ll;
 
 
int main(){    
    int t;
    cin>>t;
    while(t--){
        queueq;
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            q.push(i);
        }
        int count=1;
        int num=2;
        while(q.size()>3){
            int p=q.size();
            if(count%2)num=2;
            else num=3;
            for(int i=1;i<=p;i++){
               
                if(i%num==0){
                    q.pop();
                   
                }
                else {
                    int x=q.front();
                    q.pop();
                    q.push(x);
                    
                }
            }
            while(q.front()!=1){
                int x=q.front();
                    q.pop();
                    q.push(x);
            }
            //cout<

 D括号匹配

题意:就是最简单的括号匹配问题。。。。先看一张图

 极限通过,真服了,我一直WA,然后把题目想复杂了,但还是WA,最最后才发现是我的NO大小写错了,哎呀,我在这篇文章的时候又开始生气了哈哈哈哈。

思路:栈的应用题,左括号入栈,右括号出栈,中间出现一些特殊情况就会不匹配(也可以数一下左括号和右括号的个数来判断,注意左括号必须在第一个,右括号必须在第二个)

知识点:栈

code:

#include
using namespace std;
typedef long long ll;
 
 
int main(){
    /*queueq;
    int t;
    cin>>t;
    while(t--){
        int count=0;
 
    }*/
    string s;
    cin>>s;
    stackst;
    for(int i=0;s[i]!='@';i++){
        if(s[i]=='('){
            st.push(s[i]);
            if(i==s.size()-1)break;
            if(s[i+1]=='+'||s[i+1]=='-'||s[i]=='*'||s[i]=='/'){
                cout<<"NO"<

E铁轨

题意:判断出栈的顺序是否合理

思路:用栈模拟,例如假如5出栈,那么必须有1,2,3,4,5已经入栈,然后5再出栈,最后判断栈是否为空就好了

知识点:栈

(怎么这么多栈)

code:

#include
using namespace std;
typedef long long ll;
 
 
int main(){    
    int n;
    while(cin>>n){
        if(n==0)break;
        int a[1005]={0};
        
        int x;
        while(cin>>x){
             stacks;
        if(!x)break;
        a[0]=x;
        for(int i=1;i>a[i];
 
        }
        int p=2;
        for(int i=0;i

 F新二叉树

题意:每行给定根节点,左孩子节点,右孩子节点,根据所给序列建立二叉树,输出该二叉树先序遍历序列。

思路:根据序列建立二叉树(具体可以看代码),然后先序输出

知识点:二叉树

code:

#include
using namespace std;
typedef long long ll;
int n,root,l[1005],r[1005];
string s;
void fun(int t){
    if(t!='*'-'a'){
        cout<>n;
    for(int i=0;i>s;
        if(i==0){
            root=s[0]-'a';
        }
        l[s[0]-'a']=s[1]-'a';
            r[s[0]-'a']=s[2]-'a';
    }   
    fun(root);
}

 G.围栏修复

题意:题目不太记得了,因为有太多版本了hhh。

思路:每次取最小的两个数出列,相加,将结果放入原队列,直到队列只剩一个元素。

知识点:优先队列,哈夫曼树

code:

#include
using namespace std;
typedef long long ll;
int main(){
    int n;
    priority_queue,greater>qp;
    cin>>n;
    for(int i=0;i>x;
        qp.push(x);
    }
    ll ans=0;
    while(qp.size()>=2){
        int a=qp.top();
        qp.pop();
        int b=qp.top();
        qp.pop();
        ans+=(a+b);
        qp.push(a+b);
    }
    cout<

上面代码都是考试的时候写的,不一定是最好的,仅供参考。 

你可能感兴趣的:(上机考试,数据结构,算法,c++)