数据结构实验之栈三:后缀式求值

本文介绍了一种使用栈数据结构来解析和计算后缀表达式的算法实现。通过逐步读取输入字符串中的字符,并利用栈进行数值和操作符的管理,最终得出表达式的计算结果。

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

题目描述

对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。

输入

输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。

输出

求该后缀式所对应的算术表达式的值,并输出之。

示例输入

59*684/-3*+#

示例输出

57




#include <stdio.h>
#include<stdlib.h>
#define maxstack 1000
#define stacknum 1000
typedef struct
{
    int *top,*base;
    int stacksize;
}stack;
void Initstack(stack &s)//栈的初始化;
{
    s.base=(int *)malloc(maxstack*sizeof(int));
    if(!s.base) exit(0);//栈溢出;
    s.top=s.base;
    s.stacksize=maxstack;
}
void push(stack &s,char e)//进栈;
{
    if(s.top-s.base>=s.stacksize)
    {
        s.base=(int *)realloc(s.base,(maxstack+stacknum)*sizeof(int));
        if(!s.base) exit(0);//栈溢出;
        s.top=s.base+s.stacksize;
        s.stacksize+=stacknum;
    }
    s.top++;//栈顶元素为e;
    *s.top=e;
}
int Empty(stack &s)//判断是否为空栈;
{
    if(s.base==s.top)
        return 1;
        return 0;


}
void Pop(stack &s)//出栈;
{
    if(!Empty(s))
        s.top--;


}
void print(stack &s)
{//、栈内元素的输出;
    while(s.top!=s.base)
    {
        printf("%c",*s.top);
        Pop(s);
    }
    printf("\n");
}
void cal(stack &s,char st[],int n)//由栈的后缀式求值
{
    int i,pr,la;
    int ch;
    for(i=1;i<=n;i++)
    {
        if(st[i]>='1'&&st[i]<='9')//数字进栈;
        {
            ch=(st[i]-'0');
            push(s,ch);
        }
        else if(st[i]=='+')//+号栈内两个数出栈计算再进栈;
        {
            pr=*s.top;
            s.top--;
            la=*s.top;
            *s.top=pr+la;
        }
        else if(st[i]=='*')
        {
            pr=*s.top;
            s.top--;
            la=*s.top;
            *s.top=pr*la;
        }
        else if(st[i]=='-')
        {
            pr=*s.top;
            s.top--;
            la=*s.top;
            *s.top=la-pr;
        }
        else if(st[i]=='/')
        {
            pr=*s.top;
            s.top--;
            la=*s.top;
            *s.top=la/pr;
        }
    }
    printf("%d\n",*s.top);
}
int main()
{
    char ch,st[10000];
    int i=0;
    stack s;//栈的定义
    Initstack(s);//栈的初始化;
    while(~scanf("%c",&ch))
    {
        if(ch!='#')
            {
                  i++;
                  st[i]=ch;
            }
         else
                break;
    }
    cal(s,st,i);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值