intcompute_reverse_polish_notation(char *str) { //获取字符串长度 int len = strlen(str); //我们需要一个变量来储存读取到的字符串内的数字 int number = 0; //还要有一个变量来储存我们遍历到的字符串的位置 int index = 0;
//先声明一个栈,后续会使用 Stack S; init_stack(&S);
//这是后续进行后缀运算必需的变量 int x,y;
//循环终止条件是:一旦index等于len,就说明走完了字符串 //注意数组的最大下标是len - 1,访问第len个位置会出问题的 while (index < len) { //第一个条件判断:是否为空格 if (str[index] == ' ') { //如果是空格,直接选择跳过。 //index加1表示跳过当前的空格,直接进行下一轮循环 index++; continue; } //第二个条件判断,index指向的字符是否是数字 //这里要特别注意,数字不止是个位数,从第一个数字开始要继续往后读取处理 elseif (str[index] >= '0' && str[index] <= '9') { //number的初始值设置为0 number = 0; //循环终止的条件是读取到的字符是空格 while (str[index] != ' ') { //将字符串表示的数字转化为正常的数字 //str[index] - '0'即可得到该数字的int形式 number = 10 * number + (str[index] - '0'); //继续看下一个数字 index++; } //已得到数字,入栈 push(&S, number); } //第三个条件:是操作符 else { //以下的条件判断很容易看明白在做什么,此处不再赘述 //唯一需要强调的是,出栈的第一个数是y,第二个数是x //我们进行的操作是 x op y if (str[index] == '+') { pop(&S, &y); pop(&S, &x); push(&S, x + y); } elseif (str[index] == '-') { pop(&S, &y); pop(&S, &x); push(&S, x - y); } elseif (str[index] == '*') { pop(&S, &y); pop(&S, &x); push(&S, x * y); } elseif (str[index] == '/') { pop(&S, &y); pop(&S, &x); push(&S, x / y); } elseif (str[index] == '%') { pop(&S, &y); pop(&S, &x); push(&S, x % y); }
intcompute_reverse_polish_notation(char *str){ Stack S; init_stack(&S); int len; len = strlen(str); int i = 0; while(i < len) { if (str[i] == ' ') { i++; continue; } if (str[i] >= '0' && str[i] <= '9') { int number = 0; while (i < len && (str[i] >= '0' && str[i] <= '9')) { number = number * 10 + (str[i] - '0'); i++; } push(&S, number); } else { ElemType x, y, result = 0; pop(&S, &y); pop(&S, &x); if (str[i] == '+') result = x + y; elseif(str[i] == '-') result = x - y; elseif(str[i] == '*') result = x * y; elseif(str[i] == '/') result = x / y; elseif(str[i] == '%') result = x % y; push(&S, result); i++; } } int res; pop(&S, &res); return res; }