利用栈计算后缀表达式:
1)从左到右依次遍历表达式;
2)遇到数字就直接入栈;
.3)遇到操作符就弹出两个元素,先弹出的元素放到操作符的右边,后弹出的元素放到操作符的左边(左边的运算数先入栈,因此后出),将计算得到的结果再压入栈;
特点:操作数在运算符之后,无括号。
.中缀( InfixNotation )到后缀的手工转换方法.已知有中缀表达式为 a + b * c -( d + e ).首先将这个中缀表达式的所有运算加括号(( a +( b * c ))-( d + e )).按照由内到外的顺序,将所有运算符放到括号后面,这样就变成了(( a ( bc )*)+( de )+).去掉所有括号,得到结果 abc *+ de +-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
typedef struct st
{
int a;
struct st*Next;
}S,*St;//*St啥意思,大家可以看看CSDN其他大佬的
//我理解的就是,这儿取个名字,后面的St a相当于S* a,
//以此类推,可以简化二重指针,St* b=S** b
void In_Stack(int n,St*top);
int Out_Stack(St*top);
int main()
{
char str[N];
S*top=(S*)calloc(1,sizeof(S));
top->Next=NULL;
printf("请输入要计算的表达式:");
fflush(stdin);//先清理缓存区再scanf,养成好习惯
scanf("%s",str);
int i=0;int num;
int a,b;
while(str[i]!='\0')
{
num=str[i]-'0';
if(num>=0&&num<=9) In_Stack(num,&top);
switch(str[i])
{
case '+':b=Out_Stack(&top);
a=Out_Stack(&top);
In_Stack(a+b,&top);break;
case '-':b=Out_Stack(&top);
a=Out_Stack(&top);
In_Stack(a-b,&top);break;
case '*':b=Out_Stack(&top);
a=Out_Stack(&top);
In_Stack(a*b,&top);break;
case '/':b=Out_Stack(&top);
a=Out_Stack(&top);
In_Stack(a/b,&top);break;
}
i++;
}
int result=Out_Stack(&top);
printf("结果:%d",result);
return 0;
}
void In_Stack(int n,St*top)//由于是链栈,因此几乎不可能出现栈满
{
(*top)->a=n;
St new=(St)calloc(1,sizeof(S));
new->Next=*top;
*top=new;
}
int Out_Stack(St*top)
{
if((*top)->Next==NULL)
{printf("出现栈空,请检查式子是否正确!!!");exit(0);}
int t=(*top)->Next->a;
St tem=(*top)->Next->Next;
free((*top)->Next);//释放无意义的空间
(*top)->Next=tem;
return t;
}