中缀转后缀的程序,及详细的代码说明

测试用例的结果如图

源代码如下
#include
#include
#include
#include
#include
void fx(char arr[]);

int main(void)
{
char arr[]="3+5*(2-1)";
char brr[]="X=A+B*(C-D)/E";
char crr[]="3.14*(5.0*5.0)";
fx(arr);
fx(brr);
fx(crr);
printf("%s\n",arr);
printf("%s\n",brr);
printf("%s\n",crr);
return 0;
}
void fx(char arr[])
{       

int len=0;
for(int i=0;arr[i];i++)
{
 len++;
}
char *p=(char *)malloc(sizeof(char)*len);
   char *tmp=(char *)malloc(sizeof(char)*len);
strcpy(p,arr);
len--;
int len2=0;
for(int i=0;arr[i];i++)
{
 if(arr[i]!='(' && arr[i]!=')')
 {len2++;}
}
for(int i=0,j=0,k=0;j
{
if(isdigit(p[i])||p[i]=='.'||isalpha(p[i]))
  {
  arr[j]=p[i];
  j++;
  }
  if(p[i]=='+'||p[i]=='-'||p[i]=='*'||p[i]=='/'||p[i]=='('||p[i]=='=')
  {
    tmp[k]=p[i];
if(p[i]=='=')
{
tmp[++k]='0';
 
}
  else if(p[i]=='+'||p[i]=='-')
{ tmp[++k]='1';}
else if(p[i]=='*'||p[i]=='/')
    { tmp[++k]='2';}
else if(p[i]=='(')
    { tmp[++k]='3';}
k++;
  
  }
   if(p[i]==')')
{
for(k-=2;tmp[k]!='(';k-=2)
  arr[j]=tmp[k];
  j++;
}
  continue;
}
    if(k-1>=0 &&tmp[k-1]<=tmp[k-3]&&tmp[k-4]!='(')
{
   arr[j]=tmp[k-4];
      j++;
    tmp[k-4]=tmp[k-2];
tmp[k-3]=tmp[k-1];
k-=2;
 
 
   
}
if(i>len)
{
for(k=k-2;k>=0;k-=2)
 {
 arr[j]=tmp[k];
      j++;
}
}
}
arr[len2]='\0';

 
free(tmp);
p=NULL;
tmp=NULL;
}

详细分析与讲解






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答这个问题。中缀表达式后缀表达式需要用到栈的数据结构,以下是使用C语言实现的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> // 用于判断是否为数字 #define MAX_SIZE 100 // 定义栈的大小 char opStack[MAX_SIZE]; // 运算符栈 int numStack[MAX_SIZE]; // 数字栈 int opTop = -1; // 运算符栈栈顶指针 int numTop = -1; // 数字栈栈顶指针 int getPriority(char op) // 获取运算符优先级 { if(op == '*' || op == '/') return 2; else if(op == '+' || op == '-') return 1; else return 0; } void pushOp(char op) // 将运算符入栈 { if(opTop == MAX_SIZE-1) // 栈满 { printf("Error: stack is full!\n"); exit(1); } opStack[++opTop] = op; } void pushNum(int num) // 将数字入栈 { if(numTop == MAX_SIZE-1) // 栈满 { printf("Error: stack is full!\n"); exit(1); } numStack[++numTop] = num; } char popOp() // 弹出并返回栈顶运算符 { if(opTop == -1) // 栈空 { printf("Error: stack is empty!\n"); exit(1); } return opStack[opTop--]; } int popNum() // 弹出并返回栈顶数字 { if(numTop == -1) // 栈空 { printf("Error: stack is empty!\n"); exit(1); } return numStack[numTop--]; } void infixToPostfix(char* infix, char* postfix) // 将中缀表达式换为后缀表达式 { char* p = infix; char c, op; int num, n; while(*p != '\0') { if(isdigit(*p)) // 如果是数字,则将其压入数字栈 { num = 0; while(isdigit(*p)) { num = num*10 + (*p - '0'); p++; } pushNum(num); sprintf(postfix+strlen(postfix), "%d ", num); // 将数字添加到后缀表达式中 } else if(*p == '(') // 如果是左括号,则将其压入运算符栈 { pushOp(*p); p++; } else if(*p == ')') // 如果是右括号,则将运算符栈中的运算符弹出并添加到后缀表达式中,直到遇到左括号 { while((c = popOp()) != '(') { sprintf(postfix+strlen(postfix), "%c ", c); n = popNum(); numStack[numTop+1] = n; // 将数字入栈 numTop++; } p++; } else if(*p == '+' || *p == '-' || *p == '*' || *p == '/') // 如果是运算符 { while(opTop > -1 && getPriority(opStack[opTop]) >= getPriority(*p)) { op = popOp(); sprintf(postfix+strlen(postfix), "%c ", op); n = popNum(); numStack[numTop+1] = n; // 将数字入栈 numTop++; } pushOp(*p); p++; } else { p++; } } while(opTop > -1) // 将运算符栈中的运算符依次弹出并添加到后缀表达式中 { c = popOp(); sprintf(postfix+strlen(postfix), "%c ", c); n = popNum(); numStack[numTop+1] = n; // 将数字入栈 numTop++; } } int main() { char infix[MAX_SIZE]; char postfix[MAX_SIZE] = ""; printf("请输入中缀表达式:"); gets(infix); infixToPostfix(infix, postfix); printf("后缀表达式为:%s\n", postfix); return 0; } ``` 这个程序使用了两个栈:运算符栈和数字栈。首先遍历中缀表达式,如果遇到数字,则将其压入数字栈,并添加到后缀表达式中;如果遇到左括号,则将其压入运算符栈;如果遇到右括号,则将运算符栈中的运算符弹出并添加到后缀表达式中,直到遇到左括号;如果遇到运算符,则将运算符栈中的运算符弹出并添加到后缀表达式中直到运算符栈为空或者栈顶运算符的优先级小于当前运算符的优先级,然后将当前运算符压入运算符栈。最后,将运算符栈中的运算符依次弹出并添加到后缀表达式中。 希望能够帮到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值