题目来源: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