iT邦幫忙

0

【資料結構】前後序求值

c

前序求值

程式說明

相關函式

get_value():計算並回報結果

說明:
將引入的兩個運算元與運算子計算,並回傳結果。
int get_value(int op1, int op2, char op) {
  //printf("(%d %c %d)\n", op1, op, op2);
  switch (op) {
  case '+':
    return op1 + op2;
  case '-':
    return op1 - op2;
  case '*':
    return op1 * op2;
  case '/':
    return op1 / op2;
  case '%':
    return op1 % op2;
  default:
    return 0;
  }
}

Calculation():引入運算式字串,回傳求值答案

說明:
將引入的字串,用相反的順序計算,並將每次計算結果存入堆疊,等待輸出或引用。
void Calculation(char *str) {
  char stack[MAX];
  int top = 0, j = 0, i;
  for (i = strlen(str) - 1; i >= 0; i--) {
    // printf("\n%c\n", str[i]);
    switch (str[i]) {
    case '+':
    case '-':
    case '*':
    case '/':
    case '%':
      stack[top - 1] = get_value(stack[top], stack[top - 1], str[i]);
      top--;
      continue;
      //遇到運算符號時,將堆疊的前兩個數值做運算,
      //被計算的兩個空間移除,存入計算結果。
    default:
      stack[++top] = str[i] - 48;
      continue;
      //遇到數值時,減掉48使其為數字型態的真數,存入堆疊空間。
    }
  }
  printf("%s=%d\n",str ,stack[top]);
  //結果
}

主程式:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 20
int main() {
  char str1[MAX] = {"-+2/*3222"};
  char str2[MAX] = {"-+-/421*23*41"};
  //測資1,2
  Calculation(str1);
  Calculation(str2);
  return 0;
}

後序求值

與前序差異

avatar
1:

  • 前置式:由最後一個字元判斷到第一個字元。
  • 後置式:第一個判斷到最後一個。

2:

  • 前置式:計算運算式時,因為是倒置的關係,順序要相反。
  • 後置式:按照原順序計算即可。

尚未有邦友留言

立即登入留言