机试练习之向量、队列和栈

向量(vector)

什么是向量?

向量是可以改变其大小的线性序列容器。
向量在内部使用动态分配数组的方式来存储元素,这表明在必要时会重新分配数组,以便在插入新元素时增大其容量。

向量的具体用法

添加头文件 #include
定义一个向量 vector name
返回当前向量是否为空 empty();
返回当前向量元素的个数 size();
尾部元素的添加 push_back();
尾部元素的删除 pop_back();
在任意位置插入元素 insert();
在任意位置删除元素 erase();
将向量清空 clear();
迭代器操作:返回向量中首元素的迭代器 begin(); 返回向量中尾元素后一个位置的迭代器end();

应用:完数和盈数

题目描述

代码实现

#include<iostream>
#include<vector>
using namespace std;
int main() {
    vector<int> numberE;
    vector<int> numberG;
    int sum;
    for (int i = 2; i <= 60; i++) {
        sum = 0;
        for (int j = 1; j < i; j++) {
            if (i % j == 0) sum += j;
        }
        if (sum == i) numberE.push_back(i);
        else if (sum > i) numberG.push_back(i);
    }
    cout << "E:";
    for (int i = 0; i < numberE.size(); i++) cout << " " << numberE[i];
    cout<<endl;
    cout << "G:" ;
    for (int i = 0; i < numberG.size(); i++) cout << " " << numberG[i];
}

队列

什么是队列?

队列是一种线性的序列结构,操作受限。
新元素只能从队列的一端插入,并且只能从另一端删除已有元素。
允许队列插入的一端为队列的尾部,允许队列删除的一端为队列的头部。
先进先出

队列的用法

添加头文件#include
queue.empty();
queue.size();
queue.push();
queue.pop();
queue.front();
queue.back();

应用:约瑟夫问题

在这里插入图片描述

输入:
8 3 4
0 0 0
输出:
6,2,7,4,3,5,1,8

代码实现

#include<iostream>
#include<queue>
using namespace std;
int main(){
    int n,p,m;
    while(cin>>n>>p>>m){
        queue<int> children;
        if(n==0 && p==0 && m==0) break;
        for(int i=1;i<=n;i++) children.push(i);
        for(int i=1;i<p;i++){
            children.push(children.front());
            children.pop();
        }
        while(children.size()!=1){
            for(int i=1;i<m;i++){
               children.push(children.front());
               children.pop();
            }
            cout<<children.front()<<",";
            children.pop();
        }
        cout<<children.front();
    }

}

应用 猫狗收容所

题目为先进先出,用队列实现。
如果只用一个队列,对于有选择地收养动物无法实现。
维护两个队列,一个用于存放猫,一个用于存放狗。
添加一个order判断哪个先进的收容所。

代码实现

#include<iostream>
#include<queue>
using namespace std;
struct animal{
    int number;
    int order;
    animal(int x,int y){
        number=x;
        order=y;
    }
};
int main(){
   queue<animal> cats;
   queue<animal> dogs;
   int n,m,t;
   int order=0;
   cin>>n;
   while(n--){
       cin>>m>>t;
       if(m==1 && t>0){
           dogs.push(animal(t,order++));
       }
       else if(m==1 && t<0){
           cats.push(animal(t,order++));
       }
       else if(m==2 && t==0){
           if(cats.front().order<dogs.front().order){
               cout<<cats.front().number<<" ";
               cats.pop();
           }
           else{
               cout<<dogs.front().number<<" ";
               dogs.pop();
           }
       }
       else if(m==2 && t==1){
            cout<<dogs.front().number<<" ";
            dogs.pop();
       }
       else if(m==2 && t==-1){
           cout<<cats.front().number<<" ";
           cats.pop();
       }
   }
}

什么是栈?

栈是操作受限的线性表。
栈的操作仅限于逻辑上特定的一端,即新元素只能从栈的一端插入,也只能从这一端删除已有的元素。
栈中允许元素插入和删除的一端称为栈顶,禁止操作的盲端称为栈底。
后进先出。

栈的用法

添加头文件#include
定义一个栈stack name
stack.empty();
stack.size();
stack.push();
stack.pop();
stack.top();

应用:逆序输出

题目描述

代码实现

#include<iostream>
#include<stack>
using namespace std;
int main(){
    stack<int> num;
    int m,n;cin>>n;
    for(int i=0;i<n;i++){
        cin>>m;
        num.push(m);
    }
    for(int i=0;i<n;i++){
       cout<<num.top()<<" ";
       num.pop();
    }
}

应用:括号匹配

括号匹配是栈的一个典型应用。
遍历整个字符串,遍历过程中遇到左括号,将其放入栈中。
遇到右括号,如果栈非空,则栈顶左括号与右括号匹配;如果栈空,则表明右括号匹配失败。
字符串遍历结束后,若栈非空,则栈中的左括号匹配失败。

题目描述
在这里插入图片描述
代码实现

#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main(){
    string str;
    cin>>str;
    stack<int> brackets;
    string ans(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 ans[i]='?';
        }
    }
    while(!brackets.empty()){
        ans[brackets.top()]='$';
        brackets.pop();
    }
    cout<<str<<endl;
    cout<<ans<<endl;
}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值