北京理工大学复试上机--2010

1.输入一串整数,输入命令排序!

输入 a t 在这串整数后面添加整数 t,

输入 c\m\n 有 n 替换 m,

输入 d t 删除 t,

输入 s 排序。

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

int tonum(string s, int l) {
    int n = 1, sum = 0;
    for(int i = l - 1; i > 1; i--) {
        sum += (s[i] - ‘0‘) * n;
        n *= 10;
    }
    return sum;
}

int main() {
    int n;
    vector<int> v;
    while(cin >> n) {
        v.push_back(n);
        if(getchar() == ‘\n‘) {
            string s;
            while (getline(cin, s)) {
                if (s[0] == ‘a‘) {
                    v.push_back(tonum(s, s.length()));
                    for (int i = 0; i < v.size(); i++) cout << v[i] << " ";
                    cout << endl;
                }
                if (s[0] == ‘c‘) {
                    string s1, s2;
                    int cnt = 0, num1, num2, temp;
                    for(int k = 0; k < s.length(); k++) {
                        if(s[k] == ‘\\‘) cnt++;
                        if(cnt == 2) {
                            s1 = s.substr(0, k);
                            s2 = s.substr(k - 1, s.length() - k + 1);//这里比较麻烦 为了前面的统一化转数字
                            break;
                        }
                    }
                    num1 = tonum(s1, s1.length());
                    num2 = tonum(s2, s2.length());
                    for (int i = 0; i < v.size(); i++)
                    {

                        if(v[i] == num1) {
                            temp = v[i];
                            v.erase(v.begin() + i);
                            v.insert(v.begin() + i, num2);
                        }
                    }
                    for (int i = 0; i < v.size(); i++)
                    {
                        cout << v[i] << " ";
                    }
                    cout << endl;
                }
                if (s[0] == ‘s‘) {
                    sort(v.begin(), v.end());
                    for (int i = 0; i < v.size(); i++) {
                        cout << v[i] << " ";
                    }
                    cout << endl;
                }
                if (s[0] == ‘d‘) {
                    int num = tonum(s, s.length());
                    for (int i = 0; i < v.size(); i++) {
                        if(v[i] == num) v.erase(v.begin() + i);
                    }
                    for (int i = 0; i < v.size(); i++) {
                        cout << v[i] << " ";
                    }
                    cout << endl;
                }
            }
        }
    }
    return 0;
}

2、输入表达式,输出值。分两种情况:中缀表达式和后缀表达式。

中缀表达式求值:先将中缀表达式建立二叉树转后缀表达式(应该不会严格要求建树解决),然后再求值。

input:  1+2-1*((3+4)/5-6)+7

12+134+5/6-*-7+

result: 14.6

#include <iostream>
#include <vector>
#include <map>
#include <stack>
using namespace std;

string toSuf(string s) {
    map<char, int> isp, icp; //isp--in stack preority icp--in coming preority
    isp[‘(‘] = 1; isp[‘*‘] = 5; isp[‘/‘] = 5; isp[‘+‘] = 3; isp[‘-‘] = 3; isp[‘)‘] = 6;
    icp[‘(‘] = 6; icp[‘*‘] = 4; icp[‘/‘] = 4; icp[‘+‘] = 2; icp[‘-‘] = 2; icp[‘)‘] = 1;
    string sufstr;
    stack<char> opt;//operator
    for (int i = 0; i < s.length(); i++) {
        if (isalpha(s[i]) || (s[i] >= ‘0‘ && s[i] <= ‘9‘)) {
            sufstr += s[i];
        }
        else if (opt.empty() || icp[s[i]] > isp[opt.top()]) {
            opt.push(s[i]);
        }
        else
        {
            if(s[i] == ‘)‘) {
                while(opt.top() != ‘(‘) {
                    sufstr += opt.top();
                    opt.pop();
                }
                opt.pop();
            }
            else {
                while(!opt.empty() && isp[opt.top()] >= icp[s[i]]) {
                    sufstr += opt.top();
                    opt.pop();
                }
                opt.push(s[i]);
            }
        }
    }
    while(!opt.empty()) {
        sufstr += opt.top();
        opt.pop();
    }
    return sufstr;
}

double calSuf(string s) {
    stack<double> opd;//operand
    for(int i  = 0; i < s.length(); i++) {
        if(s[i] >= ‘0‘ && s[i] <= ‘9‘) {
            opd.push(s[i] - ‘0‘);
        }
        else {
            double opd2 = opd.top();
            opd.pop();
            double opd1 = opd.top();
            opd.pop();
            switch (s[i]) {
                case ‘+‘: opd.push(opd1 + opd2); break;
                case ‘-‘: opd.push(opd1 - opd2); break;
                case ‘*‘: opd.push(opd1 * opd2); break;
                case ‘/‘: opd.push(opd1 / opd2); break;
            }
        }
    }
    return opd.top();
}

int main() {
    int sum1, sum2;
    string s1, s2, sufs;
    cout << "请输入中缀表达式: ";
    cin >> s1;
    sufs = toSuf(s1);
    cout << "后缀表达式为: " << sufs << endl;
    cout<< "结果为: " << calSuf(sufs) << endl;
    cout << "请输入后缀表达式: ";
    cin >> s2;
    cout << "结果为: " << calSuf(s2) << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/ache/p/12563380.html

时间: 2024-10-20 18:45:57

北京理工大学复试上机--2010的相关文章

北京理工大学复试上机--2009

1.请输入字符串,最多输入4 个字符串,要求后输入的字符串排在前面,例如 输入:EricZ 输出:1=EricZ 输入:David 输出:1=David 2=EricZ 输入:Peter 输出:1=Peter 2=David 3=EricZ 输入:Alan 输出:1=Alan 2=Peter 3=David 4=EricZ 输入:Jane 输出:1=Jane 2=Alan 3=Peter 4=David 2.把上述最后结果保存到Name.txt中; #include <iostream> #i

北京理工大学复试上机--2013

1.求两个数的最大公约数 示例: 输入:24 18 输出:6 #include <iostream> #include <math.h> using namespace std; int main() { int a, b, i, j, m; while (cin >> a >> b) { m = min(a, b); j = 0; for (i = 1; i <= m; i++) { if (a % i == 0 && b % i =

北京理工大学复试上机--2016

1.输入学生信息,姓名成绩(成绩的数目不一定)输出每个学生的学号和平均成绩,以及不及格课程数超过2的学生,按不及格课程数从大到小排好序输出. input: stu1 60 70 80 30 stu2 10 20 30 40 50 stu3 10 20 30 40 50 60 30 stu4 60 80 100 stu5 50 40 30 60 70 # output: stu1 60 stu2 30 stu3 34.2857 stu4 80 stu5 50 不及格课程数超过2的学生有: stu3

北京理工大学复试上机--2020

PS: 2020的是夏令营试题 1.题目:给你一个 m*n 大小的矩阵,每个点有 0,1,2 三种取值:0 代表障碍物,1代表白纸,2 代表墨滴.每一秒墨滴可以向其上下左右扩散,将四周的白纸染色,被染色之后的白纸可以继续向四周扩散,以此类推.问经过几秒,矩阵中所有的白纸都被染色. 如果可以,则输出扩散时间: 如果不可以,则输出FALSE. 输入: m n 的大小以及矩阵每个点的值 输出: 扩散时间 或 FALSE 例如: 3 3 0 1 0 1 2 1 0 1 0 输出: 1 3 3 0 1 0

北京理工大学复试上机--2019

1.字符串解析将字符串看成不同的字符切片,切片不可重复,按字母序输出所有切片(每个切片一行) 输入: aaabbcaaabaa 输出: aa aaa b bb c #include <iostream> #include <set> using namespace std; int main() { string s; while (cin >> s) { set<string> ss; string str; int i; for (i = 0; i &l

北理工计算机复试上机 2010

1.输入一串整数,输入命令!要求    1.输入a t在这串整数后添加整数t.    2.输入c \m \n用n替换m.    3.输入d t删除t    4.输入s 排序 1 /** 2 1.输入一串整数,输入命令! 3 要求 4 1.输入a t在这串整数后添加整数t. 5 2.输入c \m \n用n替换m. 6 3.输入d t删除t 7 4.输入s 排序 8 */ 9 #include<iostream> 10 #include<vector> 11 #include<a

浙大计算机研究生复试上机考试-2010年 zoj问题

ZOJ问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2984 Accepted Submission(s): 906 Problem Description 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC. 是否AC的规则如下: 1. zoj能AC: 2. 若字符串形式为xzojx,则也能AC,其中x可以是N

浙大计算机研究生复试上机考试-2010年 最短路径问题

最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14405 Accepted Submission(s): 4408 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input 输入n,m

ZOJ问题(2010浙江大学研究生复试上机题目[找规律] hdoj 3788)

ZOJ问题 pid=3788">点击打开链接 Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3341????Accepted Submission(s): 1002 Problem Description 对给定的字符串(仅仅包括'z','o','j'三种字符),推断他能否AC. 是否AC的规则例如以下: 1. zoj能AC: