栈的应用——表达式求值

本文介绍了一种使用栈实现的中缀表达式转后缀表达式并求值的算法,详细展示了如何通过两个栈(运算符栈和操作数栈)处理输入的数学表达式,并逐步解析运算符和操作数来得到最终结果。

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

#include<stdio.h>
#include<stdlib.h>
#include<process.h>
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define stack_size 100
#define stackincrement 10
typedef int status;
typedef float SElemType;
typedef struct SNode{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
status InitStack(SqStack &s)
{//栈的初始化,建立一个空栈 
s.base=(SElemType*)malloc(stack_size*sizeof(SElemType));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=stack_size;
}
status Gettop(SqStack s,SElemType &e)
{
if(s.top==s.base)
return ERROR;
e=*(s.top-1);
return OK;
}
status Push(SqStack &s,SElemType e)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(SElemType*)realloc(s.base,(stack_size+stackincrement)*sizeof(SElemType));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=stackincrement;
}
*s.top++=e;
return OK;
}
status Pop(SqStack &s,SElemType &e)
{
if(s.top==s.base)
return ERROR;
e=*--s.top;
return OK;
}
bool In(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')')
return TRUE;
else 
return FLASE;
}
int  LocateChar(char c)
{  int k;
switch(c)
{ case '+': k=0;break;
 case '-': k=1;break;
      case '*': k=2;break;
      case '/': k=3;break;
 case '(': k=4;break;
 case ')': k=5;break;
 case '#': k=6;break;
    }
  return k;
}
char Precede(char c1, char c2)
{   int i,j;
char P[7][7]={{'>','>','<','<','<','>','>'},
               {'>','>','<','<','<','>','>'},
              {'>','>','>','>','<','>','>'},
              {'>','>','>','>','<','>','>'},
              {'<','<','<','<','<','=','$'},
              {'>','>','>','>','$','>','>'},
         {'<','<','<','<','<','$','='}};
i=LocateChar(c1);
j=LocateChar(c2);
if(P[i][j]=='$')
exit(-1);
//{printf("算符不匹配!输入错误\n");exit(-1);}
  return P[i][j];
}
SElemType Operate(SElemType a,SElemType ch,SElemType b)
{
char c=char(ch);
if(c=='*')
return (a*b);
else if(c=='/'&&b!=0)
return (a/b);
else if(c=='+')
return (a+b);
else if(c=='-')
return (a-b);
else
{
printf("ERROR!\n");
exit(-1);
}
}
SElemType EvaluateExpression()
{
SqStack OPTR,OPND;//设OPTR为运算符栈,OPND为运算数栈 
char c;
char data[11];
SElemType a,b,d,e;
InitStack(OPTR);
InitStack(OPND); 
Push(OPTR,'#');
c=getchar();
Gettop(OPTR,e);
while(c!='#'||e!='#')
{
if(In(c))
{
 switch(Precede(e,c))
 {
case'<':
Push(OPTR,c);
 c=getchar();
 break;
case'=':
Pop(OPTR,e);
c=getchar();
break;
case'>':
Pop(OPND,b);
Pop(OPND,a);
Pop(OPTR,e);
Push(OPND,Operate(a,e,b));
break;
 }//switch
}//if
else if(c>='0'&&c<='9'||c=='.')
{
 int i=0;
 while(c>='0'&&c<='9'||c=='.')
            {
      data[i]=c;
    i++;
    c=getchar();
       }
    data[i]='\0';//数字没有存满,输入字符串结束符
    d=atof(data);//此处是把数组里的数字,实际上是按字符串;转换为double类型,然后把浮点型数字入栈
    Push(OPND,d);//atof函数的形参是指针类型,故用数组名
}
else 
{
printf("input ERROR!\n");
exit(-1);
}
Gettop(OPTR,e);
}
Gettop(OPND,e);
return e;
}
int main()
{
SElemType a;
printf("please input the expression ,and end in'#':\n");
a=EvaluateExpression();
printf("%f\n",a);
return 0;

}

//------------------自己真是太粗心了,写函数时,有时候会忘记写分号,忘了函数值返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值