题目来源:http://ac.jobdu.com/problem.php?pid=1101
-
题目描述:
-
对于一个不存在括号的表达式进行计算
-
输入:
-
存在多种数据,每组数据一行,表达式不存在空格
-
输出:
-
输出结果
-
样例输入:
-
6/2+3+3*4
-
样例输出:
-
18
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 25;
int main()
{
int iData, iLen, arr[MAXN];
char c;
while(scanf("%d", &iData) != EOF)
{
arr[0] = 0, arr[1] = iData;
iLen = 1;
while(~scanf("%c", &c) && c != '\n')
{
scanf("%d", &arr[++iLen]);
switch(c)
{
case '+':
break;
case '-':
arr[iLen] = -1*arr[iLen];
break;
case '*':
arr[iLen-1] = arr[iLen] * arr[iLen-1];
iLen--;
break;
case '/':
arr[iLen-1] = arr[iLen-1]/arr[iLen];
iLen--;
break;
}
}
for(int i = 0; i <= iLen; ++i)
arr[0] += arr[i];
printf("%d\n", arr[0]);
}
return 0;
}
RE,有时间再改改,悲催!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <cstdlib>
using namespace std;
const int MAXN = 25;
int PriorityOfOperater(char c)
{
if(c == '=') return 0;
if(c == '+') return 1;
if(c == '-') return 1;
if(c == '*') return 2;
if(c == '/') return 2;
return 0;
}
void Comput_Num(stack <int> &oprand, stack <char> &oper)
{
int b = oprand.top();
oprand.pop();
int a = oprand.top();
oprand.pop();
switch(oper.top())
{
case '+':
oprand.push(a+b);
break;
case '-':
oprand.push(a-b);
break;
case '*':
oprand.push(a*b);
break;
case '/': oprand.push(a/b);
break;
default:
break;
}
oper.pop();
}
bool IsOper(char c)
{
if(c == '+' || c == '-' || c == '*' || c == '/')
return true;
return false;
}
int main()
{
int i, iLen;
double num;
char str[MAXN];
stack <int> oprand;
stack <char> oper;
while(~scanf("%s", str))
{
//scanf("%s", str);
iLen = strlen(str);
str[iLen] = '=';
str[++iLen] = '\0';
//printf("%s\n", str);
for(i = 0; i < iLen; ++i)
{
if((i == 0 && str[i] == '-' && isdigit(str[i+1])) || ((i >= 1 && (i+1 < iLen)) && IsOper(str[i-1]) && str[i] == '-' && isdigit(str[i+1])) || isdigit(str[i]))
{
if(i == 0 && str[i] == '-' && isdigit(str[i+1]))
{
num = atof(&str[++i]);
num *= -1;
}
else if((i >= 1 && (i+1 < iLen)) && IsOper(str[i-1]) && str[i] == '-' && isdigit(str[i+1]))
{
num = atof(&str[++i]);
num *= -1;
}
else
num = atof(&str[i]);
while(i < iLen && (isdigit(str[i]) || str[i] == '.'))
++i;
--i;
oprand.push((int)num);
}
else
{
if(oper.empty() || PriorityOfOperater(str[i]) > PriorityOfOperater(oper.top()))
oper.push(str[i]);
else
{
while(!oper.empty() && PriorityOfOperater(str[i]) <= PriorityOfOperater(oper.top()))
Comput_Num(oprand, oper);
oper.push(str[i]);
}
}
}
oper.pop();
printf("%d\n", oprand.top());
oprand.pop();
str[0] = '\0';
}
return 0;
}