表达式计算,输出后缀表达式,栈实现

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define StrSize 100
typedef struct Stack
{
 char data[StrSize];
 int top;
}CulStack, StrStack;
typedef struct intStack
{
 double data[StrSize];
 int top;
}StStack;
// 将中缀表达式字符串转化为后缀表达式字符串。
// 输入字符数组,以'\0'结尾,length为字符串长度。
// 输出指向StrStack 形式的指针。
StrStack *Trans(char str[], int length) {
 StrStack *sStack = (StrStack *)malloc(sizeof(StrStack));
 sStack->top = 0;
 StrStack opStack;
 opStack.top = 0;
 for (int i = 0; i < length; i++)
 {
  if (str[i] >= '0' && str[i] <= '9') {
   sStack->data[sStack->top] = str[i];
   sStack->top++;
  }
  if (str[i] == '.') {
   sStack->data[sStack->top] = str[i];
   sStack->top++;
  }
  if (str[i] == '+' || str[i] == '-')
  {
   sStack->data[sStack->top] = ' ';
   sStack->top++;
   while (opStack.top != 0 && opStack.data[opStack.top - 1] != '(')
   {
    sStack->data[sStack->top] = opStack.data[opStack.top - 1];
    sStack->top++;
    opStack.top--;
   }
   opStack.data[opStack.top] = str[i];
   opStack.top++;
  }
  if (str[i] == '*' || str[i] == '/')
  {
   sStack->data[sStack->top] = ' ';
   sStack->top++;
   while (opStack.top != 0 && opStack.data[opStack.top - 1] != '+'&&opStack.data[opStack.top - 1] != '-'&& opStack.data[opStack.top - 1] != '(')
   {
    sStack->data[sStack->top] = opStack.data[opStack.top - 1];
    sStack->top++;
    opStack.top--;
   }
   opStack.data[opStack.top] = str[i];
   opStack.top++;
  }
  if (str[i] == '(')
  {
   opStack.data[opStack.top] = str[i];
   opStack.top++;
  }
  if (str[i] == ')')
  {
   while (opStack.top != 0 && opStack.data[opStack.top - 1] != '(')
   {
    sStack->data[sStack->top] = opStack.data[opStack.top - 1];
    sStack->top++;
    opStack.top--;
   }
   opStack.top--;
  }
 }
 while (opStack.top != 0)
 {
  sStack->data[sStack->top] = opStack.data[opStack.top - 1];
  sStack->top++;
  opStack.top--;
 }
 sStack->data[sStack->top] = '\0';
 return sStack;
}
// 将后缀表达式通过栈的结构算出结果。
// 输入c形式字符串,以'\0'结尾。
// 输出int型结果。
double Calcul(StrStack *opStack) {
 StStack *sStack = (StStack *)malloc(sizeof(StStack));
 sStack->top = -1;
 double result = 0, num = 0;
 int numLen = 0;
 for (int i = 0; i < opStack->top; i++) {
  // 将字符组合成double型数据
  if (opStack->data[i] >= '0' && opStack->data[i] <= '9') {
   num = 0;
   for (numLen = 0; opStack->data[i + numLen] >= '0' && opStack->data[i + numLen] <= '9'; numLen++)
    ;
   for (int k = 0; k < numLen; k++)
    num = num + (opStack->data[i + k] - '0') * pow(10, numLen - k - 1);
   /*
   //删除此字段,20170420
   //将字符组合成数字,此段将整数部分反向组合
   //解决:先判断位数,再组合
   num = 0;
   for (numLen = 0; opStack->data[i + numLen] >= '0' && opStack->data[i + numLen] <= '9'; numLen++)
   num = num + (opStack->data[i + numLen] - '0') * pow(10, numLen);
   */
   if (opStack->data[i + numLen] == '.') {
    for (int j = -1; opStack->data[i + numLen + 1] >= '0' && opStack->data[i + numLen + 1] <= '9'; numLen++, j--)
     num = num + (opStack->data[i + numLen + 1] - '0') * pow(10.0, j);
    sStack->data[++sStack->top] = num;
    i = i + numLen;
    continue;
   }
   sStack->data[++sStack->top] = num;
   i = i + numLen - 1;
  }
  // 跳过空格
  else if (opStack->data[i] == ' ')
   continue;
  // 运算
  else {
   switch (opStack->data[i])
   {
   case '+':
    result = sStack->data[sStack->top - 1] + sStack->data[sStack->top];
    sStack->top -= 2;
    sStack->data[++sStack->top] = result;
    break;
   case '-':
    result = sStack->data[sStack->top - 1] - sStack->data[sStack->top];
    sStack->top -= 2;
    sStack->data[++sStack->top] = result;
    break;
   case '*':
    result = sStack->data[sStack->top - 1] * sStack->data[sStack->top];
    sStack->top -= 2;
    sStack->data[++sStack->top] = result;
    break;
   case '/':
    result = sStack->data[sStack->top - 1] / sStack->data[sStack->top];
    sStack->top -= 2;
    sStack->data[++sStack->top] = result;
    break;
   default:
    break;
   }
  }
 }
 free(opStack);
 return result;
}
int main() {
 char in[100];
 printf("请输入表达式:");
 scanf("%s", in);
 StrStack *str = Trans(in, strlen(in));
 printf("后缀表达式为:%s\n", str->data);
 printf("原式的答案为:%lf\n", Calcul(str));
 return 0;
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值