C语言 后缀表达式

维基百科

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

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

 

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

如果遇到数值  数值进栈 

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

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

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

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 

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值