机试指南part4——线性数据结构

向量——长度不定的数组

vector
1.构造

int a[]={1,2,3,4,5};
    vector<int> V1;
    vector<int> V2(a,a+5);
    vector<int> V3(5,2);
    vector<int> V4(V2);
    vector<int> V5(V4.begin(),V4.begin()+3);

2.操作

int n=V2.size();
    V2.pop_back();
    V2.push_back(6);
    V2.insert(V2.begin()+1,9);
    V2.insert(V2.begin(),3,7);
    V2.erase(V2.begin()+2);
    V2.clear();

队列

入队
出队
判空
访问队首

#include<iostream>
#include<cstdio>
#include<string>
#include<queue>

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\n",sum);
    return 0;
}

例题——猫狗收容所

#include<iostream>
#include<cstdio>
#include<string>
#include<queue>

using namespace std;

struct Animal{
    int number;
    int order;
    Animal(){}
    Animal(int n,int o):number(n),order(o){}
};

queue<Animal> cats;
queue<Animal> dogs;

int main()
{
    int n;
    scanf("%d",&n);
    int order=0;
    for(int i=0;i<n;++i)
    {
        int method,type;
        scanf("%d%d",&method,&type);
        if(method==1)
        {
            if(type>0)
            {
                dogs.push(Animal(type,order));
            }else
            {
                cats.push(Animal(type,order));
            }
        }else
        {
            if(type==0&&!dogs.empty()&&!cats.empty())
            {
                if(dogs.front().order<cats.front().order)
                {
                    printf("%d ",dogs.front().number);
                    dogs.pop();
                }else
                {
                    printf("%d ",cats.front().number);
                    cats.pop();
                }
            }else if(type==0&&!dogs.empty()&&cats.empty())
            {
                printf("%d ",dogs.front().number);
                dogs.pop();
            }else if(type==0&&dogs.empty()&&!cats.empty())
            {
                printf("%d ",cats.front().number);
                cats.pop();
            }else if(type==1&&!dogs.empty())
            {
                printf("%d ",dogs.front().number);
                dogs.pop();
            }else if(type==-1&&!cats.empty())
            {
                printf("%d ",cats.front().number);
                cats.pop();
            }
        }
    }
    printf("\n");
    return 0;
}

stack<int> myStack;
    for(int i=0;i<10;++i)
    {
        myStack.push(i);
    }
    int sum=0;
    while(!myStack.empty())
    {
        printf("%d ",myStack.top());
        sum+=myStack.top();
        myStack.pop();
    }
    printf("\n%d\n",sum);

栈的应用
1.逆序输出——后进先出
2.括号匹配

#include<iostream>
#include<cstdio>
#include<string>
#include<stack>

using namespace std;

int main()
{
    string str;
    while(cin>>str)
    {
        stack<int> brackets;
        string answer(str.size(),' ');
        for(int i=0;i<str.size();++i)
        {
            if(str[i]=='(')
            {
                brackets.push(i);
            }else if(str[i]==')')
            {
                if(!brackets.empty())
                {
                    brackets.pop();
                }else
                {
                    answer[i]='?';
                }
            }
        }
        while(!brackets.empty())
    {
        answer[brackets.top()]='$';
        brackets.pop();
    }
    cout<<str<<endl;
    cout<<answer<<endl;
    }

    return 0;
}

3.表达式求值

#include<iostream>
#include<cstdio>
#include<cctype>
#include<string>
#include<stack>

using namespace std;

int Priority(char c)
{
    if(c=='#'){
        return 0;
    }else if(c=='$'){
        return 1;
    }else if(c=='+'||c=='-'){
        return 2;
    }else{
        return 3;
    }
}

double GetNumber(string str,int& index)
{
    double number=0;
    while(isdigit(str[index]))
    {
        number=number*10+str[index]-'0';
        index++;
    }
    return number;
}

double Calculate(double x,double y,char op)
{
    double result=0;
    if(op=='+')
    {
        result=x+y;
    }else if(op=='-')
    {
        result=x-y;
    }else if(op=='*')
    {
        result=x*y;
    }else if(op=='/')
    {
        result=x/y;
    }
    return result;
}
int main()
{
    string str;
    while(getline(cin,str))
    {
        if(str=="0")
        {
            break;
        }
        int index=0;
        stack<char> oper;
        stack<double> data;
        oper.push('#');
        str+='$';
        while(index<str.size())
        {
            if(str[index]==' ')
            {
                index++;
            }else if(isdigit(str[index]))
            {
                data.push(GetNumber(str,index));
            }else
            {
                if(Priority(oper.top())<Priority(str[index]))
                {
                    oper.push(str[index]);
                    index++;
                }else
                {
                    double y=data.top();
                    data.pop();
                    double x=data.top();
                    data.pop();
                    data.push(Calculate(x,y,oper.top()));
                    oper.pop();
                }
            }
        }
        printf("%.2f\n",data.top());
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值