我有一个字符串(后缀表示法中的数学方程式),如下所示:数字为5.33,5.32,6.33,3.22
5.335.32*6.333.22++
我希望将其变为前缀表示法,但简单地反转字符串将无法正常工作,因为它必须保留数字的值。
我想过在for循环中通过字符交换做一个正常的字符,当遇到一个数字时把它放到一个子字符串中然后放在它上面但是我没有让它正常工作现在我是卡住。
我的最终目标是制作一个二进制表达式树,所以如果有一个比这样做更容易的方法,请告诉我。
答案 0 :(得分:1)
基于堆栈的方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *postfix_to_prefix(const char *string) {
char operator, *stack[1024];
int s = 0, number, fraction;
const char *tokens = string;
while (1) {
if (sscanf(tokens, "%1d.%2d", &number, &fraction) == 2) {
stack[s] = malloc(sizeof("1.00"));
(void) sprintf(stack[s++], "%4.2f", number + (fraction / 100.0));
tokens += strlen("1.00");
} else if (sscanf(tokens, "%c", &operator) == 1) {
char *operand1 = stack[--s];
char *operand2 = stack[--s];
stack[s] = malloc(strlen(operand1) + strlen(operand1) + sizeof(operator) + sizeof('\0'));
(void) sprintf(stack[s++], "%c%s%s", operator, operand1, operand2);
free(operand1);
free(operand2);
tokens += sizeof(operator);
} else {
break;
}
}
return stack[--s];
}
int main() {
const char *string = "5.335.32*6.333.22++";
printf("%s\n", string);
char *inverted = postfix_to_prefix(string);
printf("%s\n", inverted);
free(inverted);
return 0;
}
输出
> ./a.out
5.335.32*6.333.22++
++3.226.33*5.325.33
>
这是一个简单的实现,没有真正的错误检查或其他收尾。您将要检查减法和除法等非共同操作是否以正确的顺序出现操作数,如果没有,则将其反转。
答案 1 :(得分:0)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void) {
char exp[] = "5.335.32*6.333.22++";
size_t len = strlen(exp);
char temp[len];
char *p = temp;
for(int i = len-1; i >= 0; ){
if(isdigit(exp[i])){
memcpy(p, &exp[i-4+1], 4);//all number have a length of 4
p += 4;
i -= 4;
} else {
*p++ = exp[i--];//length of op is 1
}
}
memcpy(exp, temp, len);//Write back
puts(exp);//++3.226.33*5.325.33
return 0;
}