【上机训练】线性数据结构

向量

  1. 向量构造

#include<bits/stdc++.h>

#include <string>  

using namespace std;

int main(){
    
    
    
    int myarry[]={
    
    1,2,3,4,5};       //数组定义
    
    vector<int> myvector1;          //定义向量
    
    vector<int> myvector2(myarry,myarry+5); //复制数组内容到向量
    
    vector<int> myvector3(5,2);             //向量中添加5个2
    
    vector<int> myvector4(myvector2);       //复制向量内容到向量
    
    vector<int> myvector5(myvector4.begin(),myvector4.begin()+5); //复制向量指定范围内容到向量

    return 0;
}
  1. 向量操作

#include<bits/stdc++.h>

#include <string>  

using namespace std;

int main(){
    
    
    
    int myarry[]={
    
    1,2,3,4,5};       //数组定义
    
    vector<int> myvector(myarry,myarry+5); //复制数组内容到向量
    
    int n= myvertor.size();         //得到长度
        
    myvector.pop_back();              //弹出尾部
    
    myvector.push_back(6);             //尾部插入
    
    myvector.insert(myvector.begin()+1,9);  //在第一个而后面插入9
        
    myvector.insert(myvector.begin(),3,7);  //在开头插入3个7
     
    myvector.insert(myvector.begin(),myarry,myarry+2); //整段插入
     
    myvector.erase(myvector.begin()+6);      //删除下标为6的值
     
    myvector.erase(myvector.begin()+1,myvector.begin()+3);  //范围删除
     
    myvector.clear();
       
    return 0;
}

队列

队列操作

#include<bits/stdc++.h>

#include <string>

using namespace std;

int main(){
    
    

    queue<int> myqueue;

    for(int i=0;i<10;++i){
    
    
        myqueue.push(i);        //入队
    }   

    int sum=0;
    while(!myqueue.empty()){
    
          //出队
        sum+=myqueue.front();   //返回队头
        myqueue.pop();          //弹出队头
    }

    printf("%d",sum);

    return 0;
}
  1. 猫狗收容所(先入先出特性)

    题目描述:

    输入

    第一个是n,他代表操作序列的次数,接下来是n行,每行有两个值m和t,分别代表题目中的两个元素。

    输出

    样例输入

    样例输出

    解法思路

    代码

//队列的基本使用
#include<bits/stdc++.h>

#include <string>

using namespace std;

struct animal{
    
    
    int id;
    int order;  //用于比较排序

    animal(){
    
    }  //构造函数
    animal(int n, int o):id(n),order(o){
    
    }   //构造函数
};

int main(){
    
    

    animal a = animal();        //使用构造函数
    animal b = animal(3,2);     

    printf("%d %d\n",a.id,a.order);
    printf("%d %d\n",b.id,b.order);
    return 0;
}
#include<bits/stdc++.h>

#include <string>

using namespace std;

struct animal{
    
    
    int id;
    int order;  //用于比较排序

    animal(){
    
    }  //构造函数
    animal(int n, int o):id(n),order(o){
    
    }   //构造函数
};

queue<animal> cats;     //定义猫狗函数
queue<animal> dogs;

int main(){
    
    

    int n;
    scanf("%d",&n);     //顾客数量
    for(int i=0;i<n;++i){
    
       
        int method,type;
        scanf("%d%d",&method,&type);    //接受顾客要求
        int order=0;
        if(method==1){
    
                      //method为1,送养动物
            if(type>0){
    
                     //送狗
                dogs.push(animal(type,order++));    //直接构造好animal,送入队列
            }else if(type<0){
    
               //送猫
                cats.push(animal(type,order++));
            }
        }else{
    
                              //method为2,领养动物
            if(type==0 && !dogs.empty() && !cats.empty()){
    
      //方法一总的第一个:猫狗队列都非空,选order小的出队
                if(dogs.front().order<cats.front().order){
    
    
                    printf("%d",dogs.front().id);           //打印出队
                    dogs.pop();
                }else{
    
    
                    printf("%d",cats.front().id);
                    cats.pop();
                }
            }else if(type==0 && !dogs.empty() && cats.empty()){
    
    
                printf("%d",dogs.front().id);
                dogs.pop();
            }else if(type==0 && dogs.empty() && !cats.empty()){
    
    
                printf("%d",cats.front().id);
                cats.pop();
            }else if(type==1 && !dogs.empty()){
    
             //方法二分别的第一个:
                printf("%d",dogs.front().id);
                dogs.pop();
            }else if(type==-1 && !cats.empty()){
    
    
                printf("%d",cats.front().id);
                cats.pop();
            }
        }
    }
    printf("\n");
    return 0;
}

栈操作

#include<bits/stdc++.h>

#include <string>

using namespace std;

int main(){
    
    

    stack<int> mystack;

    for(int i=0;i<10;++i){
    
    
        mystack.push(i);        //入栈
    }

    int sum=0;
    while(!mystack.empty()){
    
          //出栈

        printf("%d\n",mystack.top());//打印栈顶

        sum+=mystack.top();
        mystack.pop();          //弹出栈顶
    }

    printf("%d",sum);

    return 0;
}
  1. 逆序输出

    题目描述:

    输入

    输出

    样例输入

    样例输出

    解法思路

    代码

  1. 括号匹配

    题目描述:

    输入

    输出

    样例输入

    样例输出

    解法思路

    扫描字符串:遇到左括号入栈、遇到右括号判断栈里有没有左括号、字母不操作

    代码

#include<bits/stdc++.h>

#include <string>

using namespace std;

int main(){
    
    

    string str;
    while(getline(cin,str)){
    
            //多组输入
        stack<int> mystack;        //本题需要标记,故将下标压入栈,方便标记
        string answer(str.size(),' ');  //标记数组初始化为空格
        for(int i=0;i<str.size();++i){
    
    
            if(str[i]=='('){
    
                //左括号入栈
                mystack.push(i);
            }else if(str[i]==')'){
    
          //右括号
                if(!mystack.empty()){
    
       //栈非空
                    mystack.pop();      //栈中的左括号出栈
                }else{
    
    
                    answer[i]='?';      //栈空,之前没有左括号和他匹配了,标记?
                }
            }
        }
        while(!mystack.empty()){
    
            //扫描完后,栈里还有左括号
            answer[mystack.top()]='$';  //弹出标记为$
            mystack.pop();
        }
        cout<<str<<endl;
        cout<<answer<<endl;
    }
    return 0;
}
//如果只需要判断成功与否
#include<bits/stdc++.h>

#include <string>

using namespace std;
bool jud(){
    
    
    string str;
    while(getline(cin,str)){
    
    

        stack<char> mystack;	//字符入栈的话,需要将stack设为char型

        for(int i=0;i<str.size();++i){
    
    
            if(str[i]=='('){
    
    
                mystack.push(str[i]);
            }else if(str[i]==')'){
    
    
                if(!mystack.empty()){
    
    
                    mystack.pop();
                }else{
    
    
                    return false;
                }
            }
        }
        if(!mystack.empty()){
    
    
            return false;
        }else{
    
    
            return true;
        }
    }

}

int main(){
    
    
    bool result=jud();
    if(result){
    
    
        printf("yes");
    }else{
    
    
        printf("no");
    }
    return 0;
}
  1. 表达式求值

    题目描述:

    输入

    输出

    样例输入

    样例输出

    解法思路

    1. ∗ * / < + -
    2. 左>右

    代码


猜你喜欢

转载自blog.csdn.net/Qmilumilu/article/details/114909875