后缀表达式计算(逆波兰)的程序代码问题
我这有段完整可运行的C代码,是用来计算后缀表达式用的,但我看不太懂。每条代码后有我的注释和问题,希望有人帮忙回答。介绍如下:
一般我们计算输入表达式是这样的,2+3 回车,结果为5
但是这段程序,输入是这样的,2 3 + 回车,结果还是为5;2 3 *回车,结果为6;2 3 / 回车,结果为0.666;2 3 pow 回车,结果为8。就相当于把计算符号放到数字后面了。
******************************************************************************************
******************************************************************************************
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
typedef struct //定义一个结构体
{
char * opstr; //定义一个字符指针
double (* opfun)(double *); //(* opfun)(double *)这是啥意思?
int argc; //定义一个argc整型
}OP_MAP; //后缀是干啥的?
double my_add(double * data); // 这定义的是啥变量,括号里定义了一个指针?
double my_sub(double * data);
double my_mul(double * data);
double my_div(double * data);
double my_sin(double * data);
double my_cos(double * data);
double my_pow(double * data);
OP_MAP map[] = { //这是啥用法,定义一个数组?
{"+", my_add, 2}, //一个数组里{ }里加{ }的用法是怎样的?里面的内容是符号,符号英文,计算数字个数?
{"-", my_sub, 2},
{"*", my_mul, 2},
{"/", my_div, 2},
{"sin", my_sin, 1},
{"cos", my_cos, 1},
{"pow", my_pow, 2},
};
void cal(char * opstr, double * data, int * count); //定义一个cal函数
int main() //主函数
{
char str[1024], opstr[1024], *p, *pe; //定义数组str,opstr,指针p,指针pe
double data[1024] = {0}, val; //定义数组data第1024个数为0,还是全部为零?定义double变量val
int count; //定义整形变量count,干吗的?
for(; gets(str) != NULL && *str != '\0'; printf("%f\n", data[count - 1]))//这个for循环开始,求详细注释指导!gets(str)是什么意思?*str呢?data[count-1]是最后的计算结果吗?
for(count = 0, p = str;; p = pe) //求每个变量含义的注释啊 T_T
{
while(isspace(*p)) p++; //isspace,检查ch是否是空格符和跳格符(控制字符)或换行符
if(*p == '\0') break; //如果是'\0',跳出。‘\0’是啥意思,空格?还是0?
val = strtod(p, &pe); //strtod(将字符串转换成浮点数),怎么用的?
if(p != pe) //p和pe代表啥?
{
data[count++] = val; //干啥用的?
}
else
{
sscanf(p, "%s", opstr); //sscanf,从一个字符串中读进与指定格式相符的数据,怎么读?
pe = p + strlen(opstr); //啥意思?
cal(opstr, data, &count); //代入cal函数
}
}
return 0;
}
void cal(char * opstr, double * data, int * count) //cal函数定义
{
int i, offset;//定义整型变量i,offset,后者代表啥?
for(i = 0; i < sizeof(map) / sizeof(OP_MAP); i++) //map是啥,上面那几个大括号么?
if(strcmp(opstr, map[i].opstr) == 0)//opstr, map[i].opstr是啥,相等代表啥?
{
offset = *count - map[i].argc; // 啥减啥,等于啥?
if(offset < 0) return; //offset<0代表啥?
data[offset] = map[i].opfun(data + offset); //这是啥意思。
*count = offset + 1; //同上。。
}
}
double my_add(double * data) //这个是函数?怎么和前边联系起来。
{
return data[0] + data[1]; //加法
}
double my_sub(double * data)
{
return data[0] - data[1]; //减法
}
double my_mul(double * data)
{
return data[0] * data[1]; //乘法
}
double my_div(double * data)
{
return data[0] / data[1]; //除法
}
double my_sin(double * data)
{
return sin(data[0]); //sin的计算,他咋实现sin计算的?是包括在<math.h>头文件里吗?
}
double my_cos(double * data)
{
return cos(data[0]); //cos的计算
}
double my_pow(double * data) //指数运算
{
return pow(data[0], data[1]);
}