用链式存储结构创建栈,并利用栈计算后缀表达式

利用栈计算后缀表达式:

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;
}
 

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值