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 

 

后缀表达式是一种将操作符追在操作数之后的表达式,也叫逆波兰表达式。在C语言中,我们可以使用栈来实现后缀表达式。 首先,我们需要将中缀表达式转换为后缀表达式。具体步骤如下: 1. 初始化一个空栈,并创建一个空字符串用于存储后缀表达式。 2. 遍历中缀表达式的每个元素: a. 如果是操作数,直接将其添后缀表达式字符串后面。 b. 如果是操作符,则比较其与栈顶操作符的优先级。 i. 如果栈为空或栈顶是"("(左括号),直接将操作符入栈。 ii. 如果栈顶的操作符优先级小于当前操作符,将当前操作符入栈。 iii. 如果栈顶的操作符优先级大于等于当前操作符,将栈顶的操作符弹出并添后缀表达式字符串后面,直到栈为空或栈顶操作符的优先级小于当前操作符。 iv. 将当前操作符入栈。 c. 如果是"("(左括号),将其入栈。 d. 如果是")"(右括号),将栈顶操作符依次弹出并添后缀表达式字符串后面,直到遇到左括号为止。弹出左括号并丢弃。 3. 如果栈不为空,将栈中剩余的操作符依次弹出并添后缀表达式字符串后面。 最后,后缀表达式的字符串即为转换后的后缀表达式。 例如,对于中缀表达式"3 + 4 * ( 2 - 1 )",对应的后缀表达式为"3 4 2 1 - * +"。 在C语言中,我们可以通过创建一个栈的数据结构来实现后缀表达式的计算。具体步骤如下: 1. 初始化一个空栈。 2. 遍历后缀表达式的每个元素: a. 如果是操作数,将其压入栈中。 b. 如果是操作符,弹出栈顶的两个操作数,按照操作符进行计算,并将结果压入栈中。 3. 最后,栈中的唯一元素即为后缀表达式的计算结果。 可以使用C语言中的数组和指针来实现栈的数据结构。具体实现方式可以参考相关的教材或参考资料。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值