C语言 后缀表达式

维基百科

逆波兰表示法Reverse Polish notationRPN,或逆波兰记法),是一种是由波兰数学家 扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。

中缀表达式 后缀表达式
1 + 2 1  2  +
1 + (2 - 3)/  4 1  2  3  -  4   /   +

 

分析 ,可以通过上面的可以得出可以使用栈的来计算后缀表达式

如果遇到数值  数值进栈 

如果遇到运算符 出栈两位 计算 , 并将结果进栈

// 逆波兰表达式, 后缀表达式  运算发放在后面

#include 
#include 
#include 

typedef double DateType;

typedef struct RpnNode{
  DateType data;
  struct RpnNode *next;
}RpnNode, *RpnNodeList;

typedef struct RpnNodeSave{
  RpnNodeList top;
  int count;
}RpnNodeSave;

// 进站
void Push(RpnNodeSave *L, DateType data){
  RpnNode *node, *top;

  top = L->top;

  node = (RpnNode *)malloc(sizeof(RpnNode));
  node->data = data;
  node->next = top;

  L->top = node;
  L->count++;
}

// 出站
void Pop(RpnNodeSave *ptr, DateType *e){
  RpnNode *node, *topnext;

  node = ptr->top;
  *e = node->data;
  topnext = node->next;

  free(node);

  ptr->top = topnext;
  ptr->count--;
}

// 打印值
void printStack(RpnNode *L){
  while(L->next){
    printf("%f->", L->data);
    L = L->next;
  }

  printf("\n");
}

int main(int argc, char const *argv[])
{
  /* code */
  char data;
  char str[10];
  int i = 0;

  DateType start, end, store, result;

  RpnNode *stractHead;
  stractHead = (RpnNodeList)malloc(sizeof(RpnNode));
  stractHead->next = NULL;

  RpnNodeSave *stractPtr;
  stractPtr = (RpnNodeSave *)malloc(sizeof(RpnNodeSave));
  stractPtr->top = stractHead;
  stractPtr->count = 0;

  printf("请输入一串后缀表达式, 以Enter结束: \n");
  scanf("%c", &data);
  while(data != '\n'){


    while(isdigit(data) || '.' == data){
      str[i++] = data;
      str[i] = '\0';
      if (i >= 10){
        printf("输入的单个数据过大\n");
        return -1;
      }

      scanf("%c", &data);
      if(' ' == data){
        store = atof(str);

        Push(stractPtr, store);
        i = 0;
        break;
      }
    }

    switch(data){
      case '+':
        Pop(stractPtr, &end);
        Pop(stractPtr, &start);

        Push(stractPtr, start + end);
        break;
      case '-':
        Pop(stractPtr, &end);
        Pop(stractPtr, &start);

        Push(stractPtr, start - end);
        break;
      case '*':
        Pop(stractPtr, &end);
        Pop(stractPtr, &start);

        Push(stractPtr, start * end);
        break;
      case '/':
        Pop(stractPtr, &end);
        Pop(stractPtr, &start);

        if(end == 0){
          printf("输入错误,除数不能为0\n");
          return -1;
        }
        Push(stractPtr, start / end);
        break;
    }
    scanf("%c", &data);
  }

  Pop(stractPtr, &result);
  printf("result: %f \n", result);

  getchar();
  return 0;
}

 

请输入一串后缀表达式: 
1 2 3 - 4 / +
result: 0.750000 

 

你可能感兴趣的:(C语言 后缀表达式)