2014华为校招 重邮机试 2013.9.14 第一场

来源:互联网 发布:做一个java web项目 编辑:程序博客网 时间:2024/06/03 13:59

题目来源:http://download.csdn.net/detail/zhou20071801/6276543

 

第一题:

第二题:

 

第三题:

 

总结:第1题水题,第2题典型约瑟夫环问题,第三题标准解法应该是使用 数据结构教材上讲的 栈 + 后缀表达式。

这里给出第三题自己的一种拙劣解法,如有问题望大家不吝指正,代码如下:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<vector>#include<list>#include<stack>#include<queue>#include<string>#include<algorithm>using namespace std;typedef enum{    status_L_operand,    status_R_operand,    status_operator,}STATUS;typedef enum{    LEVEL_LOW,    LEVEL_HIGH,}LEVEL;stack<int>  sOperand;stack<char> sOperator;void calcOnce(void){    int num_r = sOperand.top();    sOperand.pop();    int num_l = sOperand.top();    sOperand.pop();    char operation = sOperator.top();    sOperator.pop();    int result=0;    switch(operation){    case '+':        result = num_l + num_r;        break;    case '-':        result = num_l - num_r;        break;    case '*':        result = num_l * num_r;        break;                        case '/':        if(num_r==0)            break;        result = num_l / num_r;        break;    }    sOperand.push(result); }int main(){#ifndef ONLINE_JUDGE    freopen("testCase-3.txt","r",stdin);#endif    char buffer[2048];    while(scanf("%s",buffer)!=EOF){        int len= strlen(buffer);        int i=0;        STATUS status = status_L_operand;        LEVEL level = LEVEL_LOW; //        int num=0;        while(i<len){            num = 0;            switch(status){            case status_L_operand:                while(buffer[i]>='0'&&buffer[i]<='9'){                    num = num*10+(buffer[i] - '0');                    i++;                }                sOperand.push(num);                status= status_operator;                break;                    case status_operator:                switch(buffer[i]){                case '+':                case '-':                    level = LEVEL_LOW;                    sOperator.push(buffer[i]);                    break;                case '*':                case '/':                    level = LEVEL_HIGH;                    sOperator.push(buffer[i]);                    break;                }                status = status_R_operand;                i++;                break;                    case status_R_operand:                         while(buffer[i]>='0'&&buffer[i]<='9'){                    num = num*10+(buffer[i] - '0');                    i++;                }                sOperand.push(num);                //status= status_operator;                if(level == LEVEL_HIGH){                    if((buffer[i]!='*'&&buffer[i]!='/')){                        while(sOperator.size())                            calcOnce();                       }                    else                         calcOnce();                }                else if((level == LEVEL_LOW)&&( buffer[i]!='*'&&buffer[i]!='/')){                        calcOnce();                                   }                status = status_operator;                break;            }        }        int result = sOperand.top();        sOperand.pop();        printf("%d\n",result);}    fclose(stdin);    return 0;}


 

测试用例:

3-2+15*2
3-2+2*3*4/8
2*3+10-5*2
1+2+3*4+5-6/6+7*8

测试输出:

31

4

6

75

 

0 0