c - 反转字符数组而不更改数字值?

标签 c algorithm

例如,我有一个字符串(后缀表示法中的数学方程),如下所示:数字为 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/

相关文章:

c - 为什么我不能将二维数组传递给这个定义的函数?

c - c11 _Generic 泛型关联的结果表达式的每个分支都必须有效吗?

java - 如何相交两个排序的整数数组而不重复?

c++ - 计算 1 到 n 的二进制数

c - 为什么我的 C 程序在第一个 for 循环完成后崩溃?

c++ - 混合使用 C、C++ 和 Fortran 代码

algorithm - 玩家可以连续移动多次的 Minimax 树

将 2d 多边形最佳分割(即镶嵌/分区)到更小的多边形的算法?

对 C 中的 GCC 和 scanf 感到困惑

algorithm - 如何操纵围绕中心值震荡的价格序列(指标)?