中缀表达式转变为后缀表达式&后缀表达式求值

本文介绍了一种使用C语言实现的表达式转换与计算方法,包括将中缀表达式转换为后缀表达式,并对其进行计算。通过使用栈来处理括号、运算符和操作数,实现了对表达式的有效解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <string.h>
#include "stdio.h"
#include "stdlib.h"
#define max 100               //栈的最大容量
typedef struct
{
   int stack[max];
   int top;
}qstack;

void tranaform(qstack *s,char exp[])
{
   s->top=-1;
   char ch;
   char str[max];
   int i=0,j=0,tm;
   gets(str);                                    
   int StrEnd = strlen(str);
   str[StrEnd] = '#';  //输入表达式,以‘#’结束
   //printf("strlen(str) = %d\n", strlen(str));
   ch=str[0];
   while(ch!='#')
   {
      switch(ch)
      {
      case '(':                                 //判断为左括号
          s->stack[++s->top]=ch;
          break;
      case ')':                                 //判定为右括号
          while(s->stack[s->top]!='(')
          {
             exp[i++]=s->stack[s->top--];
          }
          s->top--;
          break;
      case '-':                                 //判定为加减号
      case '+':
          while(s->top>=0&&s->stack[s->top]!='(')
          {
             exp[i++]=s->stack[s->top--];
          }
           s->stack[++s->top]=ch;
           break;
      case '/':                                 //判定为乘除号
      case '*':
          while((s->stack[s->top]=='*'||s->stack[s->top]=='/')&&s->top>=0)
          {
             exp[i++]=s->stack[s->top--];
          }
          s->stack[++s->top]=ch;
          break;
      default:                                  //判定为数字
             tm=0;
             
             /**以字符的ASCII 10进制值表示数字,实际上存入exp的是字符,
             *如若数字为48,则存入的字符为'0',
             *后面计算的时候用的数字48而非字符本身值
             **/
             
             while(ch>='0'&&ch<='9')
             {
                 tm=tm*10+ch-'0';              //转换为10进制
                 ch=str[++j];
             }
             exp[i++]=tm;                      
             --j;
             break;
      }//switch
         ch=str[++j];
   }//while循环
   while(s->top>=0)
   {
      exp[i++]=s->stack[s->top--];
   }
   exp[i]='#';                                //置#结束符
   for(j=0;j<=i;j++)                          //输出后缀表达式
   {
       if(exp[j]=='#') break;
       if(exp[j]=='-'||exp[j]=='+'||exp[j]=='/'||exp[j]=='*')
           printf(" %c",exp[j]);
       else
           printf(" %d",exp[j]);
   }
}
void compute(qstack *s,char exp[])
{
   int i=0,j,temp;
   char ch;
   s->top=-1;
   ch=exp[0];
   while(ch!='#')
   {
        switch(ch)
        {
        case '-':
            temp=s->stack[s->top]-s->stack[s->top-1];
            s->stack[--s->top]=temp;
            printf("\ntemp=%d",temp);
            break;
        case '+':
            temp=s->stack[s->top]+s->stack[s->top-1];
            s->stack[--s->top]=temp;
            printf("\ntemp=%d",temp);
            break;
        case '/':
            temp=s->stack[s->top]/s->stack[s->top-1];

            s->stack[--s->top]=temp;
            printf("\ntemp=%d",temp);
            break;
        case '*':
            temp=s->stack[s->top]*s->stack[s->top-1];
            s->stack[--s->top]=temp;
            printf("\ntemp=%d",temp);
            break;
        default:
            s->stack[++s->top]=ch;
            break;
        }
        ch=exp[++i];
   }
   printf(" %d ",s->stack[s->top]);             //输出结果
}
int main(int argc, char* argv[])
{
    char exp[max];            //存储转换后的后缀表达式
    qstack s;
        tranaform(&s,exp);        //转换为后缀表达式
        compute(&s,exp);          //计算结果
    return 0;
}


转载于:https://my.oschina.net/ervinfly/blog/311400

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值