【算法题】机试指南-STL实现篇

本文仅供个人学习使用,免费分享。每日更新,建议关注收藏!
目前[机试指南]本系列已经达到字数10w+,所以按原每个章节拆开发布,点击目录跳转。

本站友情链接:

  1. c/c++算法题指南
    严书代码
    c/c++大复习1
    c/c++大复习2
  2. python算法题指南
    牛客华为机试103精华
    python输入输出大全
    python语法
    PAT甲级真题刷题笔记 共179道
  3. python官方文档
    python官方文档
  4. 机试指南系列
    基础篇
    贪心篇
    递归分治搜索篇
    数据结构进阶篇(树/图/优先队列)
    数学问题篇
    动态规划篇
    STL篇


本篇有些用python实现的题目,后续会补上用STL实现的解法。

STL

STL定义了强大的、基于模板的、可复用的组件,实现了许多通用的数据结构及处理这些数据结构的算法。其中包含三个关键组件——容器(container,流行的模板数据结构)、迭代器(iterator)和算法(algorithm)。

容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
迭代器 用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。
算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。

STL用法

向量vector

vector可以用来作为图的邻接表。
凡是不知道开多大数组的,就用vector。

队列queue

  1. 循环队列的实现:quene队首元素出队后再压入队列尾部
  2. 常用于bfs
struct animal{
	int number;//动物编号
	int order;//进入收容所次序
	animal(int n,int o):number(n),order(o){}//构造函数
};

queue<animal> cats;
queue<animal> dogs;

dogs.push(animal(type,order++));
printf("%d ",dogs.front().number);

栈stack

  1. 逆序输出
  2. 括号匹配
    左括号进栈;右括号则将栈中左括号出栈一个,若栈空则匹配失败;字符串遍历完后若栈非空,匹配失败。
  3. 表达式求值
    运算符优先级不同,不确定的运算符先放入栈中存储,设置运算符和运算数两个栈
    若栈顶运算符优先级比当前字符小,则将当前字符压入栈;若大于,则弹出运算符,从运算数栈中弹出两个数进行运算后再将结果压入运算数栈。
    运算数直接压入该栈。

例题5.1 完数与盈数(清华大学复试上机题) http://t.cn/AiKEyQWW

import sys
wan=[]
ying=[]
for i in range(2,61):
    sum=0
    for k in range(2,i):
        if(i%k==0):sum+=k
    if(sum+1==i):wan.append(i)
    elif(sum+1>i):ying.append(i)
print('E:',end=' ')
for item in wan:
    print(item,end=' ')
print('\r')
print('G:',end='')
for item in ying:
    print(' '+str(item),end='')

例题5.2 约瑟夫问题 链接失效

例题5.3猫狗收容所 链接失效

例题5.4 Zero-complexity Transposition(上海交通大学复试上机题) http://t.cn/AiKa20bt
注意该题输入数字大于2^31-1,用long long (lld)

import sys

for line in sys.stdin:
    n = int(line)
    nums=input().split()
    nums=nums[::-1]
    for i in range(len(nums)):
        if(i!=len(nums)-1):print(nums[i],end=' ')
        else:print(nums[i],end='')
    

例题5.5 括号匹配问题 http://ccnu.openjudge.cn/practice/1978/
注意这个利用字符串下标 对应 数组下标,将字符串下标压入栈,根据字符串下标 当作 数组下标 赋值 的思想。

#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>
#include <stack>

using namespace std;

stack<int> S;//定义一个堆栈

int main()
{
    char c[100];//输入字符串
    char a[100] = "0";//输出字符串

    while(scanf("%s",c) != EOF){
        int n = strlen(c);
        int i;
        for(i = 0;i < n;i++){ //遍历输入字符串
            if(c[i] == '('){ //左括号
                S.push(i);//把左括号的序号压栈(不是左括号入栈)
                a[i] = ' ';
            }
            else if(c[i] == ')'){
                if(S.empty() == false){ //右括号,栈不为空时
                    S.pop(); //栈顶元素弹出
                    a[i] = ' ';
                }
                else{ //右括号,栈为空
                    a[i] = '?';
                }
            }
            else{
                a[i] = ' ';
            }
        }
        a[i] = '\0'; //结尾元素
        //遍历栈
        int k;
        while(!S.empty()){
            k = S.top(); //取栈顶元素
            a[k] = '$';
            S.pop(); //栈顶元素出栈
        }
        puts(c);
        puts(a);
    }

    return 0;
}

例题5.6 简单计算器(浙江大学复试上机题) http://t.cn/AiKoGS94
常规做法是设置两个栈,运算符栈,操作数栈,注意运算符直接的优先级比较

import sys
for line in sys.stdin:
    a = eval(line)
    print(int(a))

习题5.1 堆栈的使用(吉林大学复试上机题) http://t.cn/AiKKM6F6

import sys

stack=[]
point=-1
for line in sys.stdin:
    if line :
        n=int(line)
        while n>0:
            try:
                op=input() #要做input的异常处理 才能通过
            except EOFError:
                break
            if(op=='A'):
                if(stack==[]):print('E')
                else:print(stack[point])
            elif(op=='O'):
                if(stack==[]):continue
                else:
                    del stack[point]
                    point-=1
            else:
                op=op.split()
                point+=1
                stack.append(op[1])
            #print(op,stack,point)
            n-=1


习题5.2 计算表达式(上海交通大学复试上机题) http://t.cn/AiKKJjJ5

import sys

for line in sys.stdin:
    a = line
    if a=='0\n':
        break
    print('{:.2f}'.format(eval(a)))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值