留求艺—您的留学规划师

C语言 逆波兰表达式

236次

问题描述:

C语言 逆波兰表达式求高手给解答

最佳答案

推荐答案

这个问题可以分为3部分1、输入一个字符串,将其格式化的储存在一个数组中,以方便的记录表达式中数和各个符号的出现顺序约定在数组中记录时,每个数或符号用两个整数来记录第一个整数记录该位是什么东西,0表示是一个数,1表示是括号,2表示反括号,3、4、5、6分别表示乘除加减号如果该位是一个数,那么第二个整数记录着个数的具体取值,否则记录该位的符号的ASCII码比如字符串"(1-23)"会被转化成二位数组 ,,,, }这个转化过程每什么技巧性,对原字符串各位顺次判断并处理即可原先的字符串中可能出现一元运算符正号'+'和负号'-',为了处理方便,一律在其前面加个0,改写成"0+..."或者"0-..."另外为了之后转化逆波兰表达式方便,处理过程中会在转化出的数组的首尾一律添加一对括号2、将之前所提到的格式数组转化为逆波兰表达式约定依然用二位数组记录一个逆波兰表达式,并且格式与之前的数组相同,除了没有括号以外比如逆波兰表达式 1 2 - 35 +,会被记录成{,,,, }转化时,需要用一个栈具体转化操作如下:顺次处理格式数组的每一位,对其作判断如果该位是一个数或者是括号'(',,将其入栈如果该位是乘号'*'或者除号'/',不断进行出栈操作直到栈顶元素是个括号'('或者加号'+'或者减号'-',然后将这个乘号或者除号入栈如果该位是加号'+'或者减号'-',不断进行出栈操作直到栈顶元素是个括号'(',然后将这个加号或者减号入栈如果该位是反括号')',那么不断进行出栈操作直到有一个括号'('出栈在上述操作中,所有的出栈元素,除了括号'('以外,都被顺次添加到所要生成的逆波兰表达式的末尾这样就转化出了一条逆波兰表达式3、对逆波兰表达式求值求值时,也需要用到一个栈求值步骤如下:顺次处理逆波兰表达式的每一位,对其作判断如果该位是一个数,将这个数入栈如果该位是一个运算符,那么连续进行两次出栈操作,可以得到栈顶的两个元素,对这两个元素用该位的运算符做运算,将所得的结果入栈比如,如果当时栈顶元素是3,次栈顶的元素是2,运算符是减号'-',那么连续两次出栈得到3和2两个元素,再将2-3的运算结果1入栈注意有些运算符(减号和除号)不符合交换律,因此运算时必须是次栈顶元素在前、栈顶元素在后,顺序不能反当每一位都处理完了之后,只要输入的是一个合法的逆波兰表达式,必然栈中只剩下一个元素,这个元素就是逆波兰表达式求值的结果源代码如下:#include #include void transform(char *str,int a[],int *n)//将输入的字符串转化为格式化的数组以记录输入的表达式,str为输入的字符串,a为目标数组,n记录数组a的大小 {int i;*n=1;a[0][0]=1;a[0]='(';//在表达式首添加一个括号for (i=0;str[i];){if (isdigit(str[i])){a[*n][0]=0;a[*n]=0;while (isdigit(str[i])){a[*n]=a[*n]*10+str[i]-'0';i++;}}else{if (str[i]=='(') a[*n][0]=1;else if (str[i]==')') a[*n][0]=2;else if (str[i]=='*') a[*n][0]=3;else if (str[i]=='/') a[*n][0]=4;else if (str[i]=='+' || str[i]=='-'){if (i==0 || (!isdigit(str[i-1]) && str[i-1]!=')')){a[*n][0]=0;a[*n]=0;(*n)++;}if (str[i]=='+') a[*n][0]=5;else a[*n][0]=6;}a[*n]=str[i];i++;}(*n)++;}a[*n][0]=2;a[*n]=')';//在表达式尾添加一个反括号(*n)++;}void poland(int a[],int n,int p[],int *m)//将格式化数组转化为逆波兰表达式,a为输入的数组,n为其长度,p为输出逆波兰表达式的目标,m记录逆波兰表达式的长度 {int i;int stack[1000];//转化所用的栈int depth;//栈的深度depth=0;*m=0;for (i=0;i

C语言 逆波兰表达式

网站首页  |  关于我们  |  联系方式  |  用户协议  |  隐私政策  |  在线报名  |  网站地图