2016-11-06 46 views
-2

我的字符串,例如(在后缀符号数学公式),看起来像这样:这些数字是5.33,5.32,6.33,3.22反转字符数组而不更改数字的值?

5.335.32*6.333.22++ 

我期待,使之成为前缀符号,但简单地颠倒该字符串将不起作用,因为它必须保留数字的值。

我曾经想过在for循环中通过字符交换来做一个正常的字符,当遇到一个数字时,把它变成一个子字符串,然后把它放在后面,但是我没有得到它的正常工作,米卡住了。

我的最终目标是制作一个二进制表达式树,所以如果有比这更简单的方法,请让我知道。

+0

首先,'5.335.32'需要分隔符如'5.33 5.32' – BLUEPIXY

+0

@BLUEPIXY在这种情况下所有整数都是0.00格式,这会改变什么吗? – rezon

+0

我明白了。但我认为这需要额外的努力。 – BLUEPIXY

回答

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; 
} 
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 
> 

这是一个光秃秃的骨头实现,没有真正的错误检查,也没有其他收尾。您需要检查减法和除法等非共享操作是否按照正确的顺序与操作数一起出来,如果不是,则反转它们。