例如,我有一个字符串(后缀表示法中的数学方程),如下所示:数字为 5.33,5.32,6.33,3.22
5.335.32*6.333.22++
我希望将其变成前缀表示法,但简单地反转字符串是行不通的,因为它必须保留数字的值。
我想过在 for 循环中进行正常的逐个字符交换,当遇到一个数字时,将其放入子字符串中,然后将其放在上面,但我还没有让它正常工作,现在我卡住了。
我的最终目标是从中创建一个二叉表达式树,所以如果有比这样做更简单的方法,也请告诉我。
最佳答案
基于堆栈的方法:
#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
>
这是一个简单的实现,没有真正的错误检查或其他最后的修饰。您需要检查减法和除法等非交换运算是否以正确的顺序输出操作数,如果不正确,则将其反转。
关于c - 反转字符数组而不更改数字值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40445718/