2016-11-06 38 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 
> 

這是一個光禿禿的骨頭實現,沒有真正的錯誤檢查,也沒有其他收尾。您需要檢查減法和除法等非共享操作是否按照正確的順序與操作數一起出來,如果不是,則反轉它們。