69,373
社区成员
发帖
与我相关
我的任务
分享
// eval - 计算字符串表达式的值
// 表达式只由+-*/四种运算符及正整数组成,没有括号,没有空格
// @param s - 表达式字符串的起始位置
// @param e - 表达式字符串的结束位置(不算在表达式内)
//
int eval(const char *s, const char *e)
{
const char *p;
// 计算+-
for (p = e - 1; p > s; --p) {
switch (*p) {
case '+':
return eval(s, p) + eval(p + 1, e);
case '-':
return eval(s, p) - eval(p + 1, e);
default:
break;
}
}
// 计算*/
for (p = e - 1; p > s; --p) {
switch (*p) {
case '*':
return eval(s, p) * eval(p + 1, e);
case '/':
return eval(s, p) / eval(p + 1, e);
default:
break;
}
}
// 计算数值部分
return atoi(s);
}
// 测试代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
static const char ops[] = "+-*/";
char expr[] = "1+2-3*4/5";
int i;
srand(time(NULL));
for (i = 0; i < N; ++i) {
expr[0] = (rand() & 7) + '1';
expr[1] = ops[rand() & 3];
expr[2] = (rand() & 7) + '1';
expr[3] = ops[rand() & 3];
expr[4] = (rand() & 7) + '1';
expr[5] = ops[rand() & 3];
expr[6] = (rand() & 7) + '1';
expr[7] = ops[rand() & 3];
expr[8] = (rand() & 7) + '1';
printf("%s = %d\n", expr, eval(expr, expr + 9));
}
return 0;
}
// eval.c 计算字符串计算式的值
#include <string.h>
#include <stdio.h>
int find_last(const char* s,char a)
{
int pos = strlen(s);
// 从字符串末尾位置开始查找
const char* p = s + pos;
// 如果没有到达字符串开始的前一个位置(s-1)
while((s-1)!=p)
{
// 如果当前位置的字符就是要查找的字符
if(*p == a)
{
break; // 结束查找哦啊
}
p--; // 变换到下一个位置
pos--;
}
if((s-1)!=p) // 找到字符
{
return pos;
}
else // 未找到
{
return -1;
}
}
// 取得字符串的左半部分
char* left_str(char* s,int pos)
{
s[pos] = '\0';
return s;
}
// 取得字符串的右半部分
char* right_str(char* s,int pos)
{
return s + pos + 1;
}
// 计算字符串计算式s的值
int eval(char* s)
{
int n = 0;
// 找到最后一个加号
n = find_last(s,'+');
if(-1 != n)
{
// 以加号所在的位置,将字符串分为左右两部分分别计算
// 然后将两部分的值加起来
return eval(left_str(s,n)) + eval(right_str(s,n));
}
n = find_last(s,'-');
if(-1 != n)
{
return eval(left_str(s,n)) - eval(right_str(s,n));
}
n = find_last(s,'*');
if(-1 != n)
{
return eval(left_str(s,n)) * eval(right_str(s,n));
}
n = find_last(s,'/');
if(-1 != n)
{
return eval(left_str(s,n)) / eval(right_str(s,n));
}
// 当字符串中不包含运算符时,返回这个数字本身
return atoi(s);
}
int main(int argc,char* argv[])
{
// 检查参数是否合法
if(2 != argc)
{
puts("usage: eval 1+2+3");
return 1;
}
// 复制从参数得到的计算式字符串
char expr[32] = "";
strcpy(expr,argv[1]);
// 对计算式字符串进行计算,得到结果
int res = eval(expr);
// 输出结果
printf("%s = %d",argv[1],res);
return 0;
}
//找到最后一个低优先级的运算符,它将是最后被计算的
if (-1 != (n=find_last(s, "+-"))) {
if ('+' == s[n])
return eval(left(s,n)) + eval(right(s,n));
else if ('-' == s[n])
retur eval(left(s,n)) - eval(right(s,n));
} else if (-1 != (n=find_last(s, "*/"))) {
// 现在只剩下高优先级的运算符了,最后一个是最后被计算的
if ('*' == s[n])
return eval(left(s,n)) * eval(right(s,n));
else if ('/' == s[n])
retur eval(left(s,n)) / eval(right(s,n));
} else {
}
str = "1+2*3"
value = eval(str)
print "%s=%d"%(str,value)