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

题目来源: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值