算术表达式求值

#include <stdio.h>
#define maxsize 50//定义最大的量
struct
{
 char data[maxsize];
 int top;
}op;
void trans(char exp[],char postexp[])//讲先序变为中序
{
 char ch;
 int i=0,j=0;
 ch=exp[i];i++;
 op.top=-1;
 while(ch!='\0')
 {
  switch (ch)
  {
  case '(':
   op.top++;
   op.data[op.top]=ch;
   break;
  case '+':
  case '-':
   while (op.top!=-1 && op.data[op.top]!='(')
   {   
    postexp[j]=op.data[op.top]; j++;
    op.top--;
   }
   op.top++;op.data[op.top]=ch;
   break;
  case ')':
   while (op.data[op.top]!='(')
   {
    postexp[j]=op.data[op.top];
    j++;
    op.top--;
   }
   op.top--;
   break;
  case '*':
  case '/':
   while (op.top!=-1 && op.data[op.top]!='(' 
    && (op.data[op.top]=='*' || op.data[op.top]=='/'))
   {   postexp[j]=op.data[op.top];j++;
   op.top--;
   }
   op.top++;op.data[op.top]=ch;
   break;
  case ' ':break;
  default:
   while(ch>'0'&&ch<'9')
   {
    postexp[j]=ch;j++;
    ch=exp[i];i++;
   }
   i--;
   postexp[j]='#';j++;
  }
  ch=exp[i];i++;
 }
 while(op.top!=-1)
 {
  postexp[j]=op.data[op.top];j++;
  op.top--;
 }
 postexp[j]='\0';
}
struct 
{
 float data[maxsize];
 int top;
}st;
//********逆波兰式*********//
int copputer(char postexp[])//
{
 int i=0;
 char ch;
 st.top=-1;
 ch=postexp[i];
 float a=0.0;
 while (ch!='\0')
 {
  switch (ch)
  {
  case '+':
   st.data[st.top-1]=st.data[st.top]+st.data[st.top-1];
   st.top--;
   break;
  case '-':
   st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];
   st.top--;
   break;
  case '*':
   st.data[st.top-1]=st.data[st.top]*st.data[st.top-1];
   st.top--;
   break;
  case '/':
   st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];
   st.top--;
   break;
  case '#':
   break;
  default:
   a=0;
   while(ch>='0'&&ch<='9')
   {
    a=a*10+ch-'0';
    i++;ch=postexp[i];
   }
   i--;
   st.top++;
   st.data[st.top]=a;   
  }
  i++;ch=postexp[i];
 }
 printf("%f\n",st.data[st.top]);
 return st.data[st.top];
 
}
//*****主函数****//
int main()
{
 char exp[15]="(8+2-(1-3))";
 char postexp[20]="\0";
 trans(exp,postexp);
 copputer(postexp);
}

 

转载于:https://www.cnblogs.com/lisongfeng9213/p/3367045.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值