19009 后缀表达式

本文探讨了一位程序员在解决19009后缀表达式问题时遇到的困难,重点在于如何调试代码并找出OJ不过的原因,包括栈的使用、逆波兰式解析和运算符优先级。通过实例分析和代码实现,提供了解决此类问题的方法和步骤。
摘要由CSDN通过智能技术生成

####测试都正常但是过不了OJ 不知道为什么

19009 后缀表达式
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题 语言: G++;GCC
Description
人最熟悉的是中缀表达式,但计算机比较难处理中缀表达式,所以往往将中缀表达式改为后缀表达式。
后缀表达式,又称逆波兰式。现在从键盘读入一个后缀表达式,只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。
每个运算数之间用一个空格隔开,题目所使用的运算数均小于10,并确保所给的表达式合法。以@作为结束标志。

输入格式
一个后缀表达式。

输出格式
表达式结果。

输入样例
6 9 4 3 +*-@

输出样例
-57

#include<malloc.h>
#include<stdio.h>
#include<ctype.h>
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACKINCREMENT 10 // 存储空间分配增量

typedef int SElemType; // 定义栈元素类型
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等

struct SqStack
{
    SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
    SElemType *top; // 栈顶指针
    int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈

Status InitStack(SqStack &S)
{
// 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE
// 请补全代码
    S.base=(SElemType*)malloc(sizeof(SElemType)*STACK_INIT_SIZE);
    if(!S.base)
        return ERROR;
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}

Status Push(SqStack &S,SElemType e)
{
// 在栈S中插入元素e为新的栈顶元素
// 请补全代码
    if(S.top-S.base==STACK_INIT_SIZE)
    {
        S.base=(SElemType*)realloc(S.base,sizeof(SElemType)*(S.stacksize+STACKINCREMENT));
        if(!S.base)
            return ERROR;
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top=e;
    S.top++;
    return OK;

}

Status Pop(SqStack &S,SElemType &e)
{
// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
// 请补全代码
    if(S.base==S.top)
        return ERROR;
    S.top--;
    e=*S.top;
    return OK;
}

Status GetTop(SqStack S)
{
// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
// 请补全代码
    int e;
    if(S.base==S.top)
        return ERROR;
    S.top--;
    e=*S.top;
    return e;
}

int StackLength(SqStack S)
{
// 返回栈S的元素个数
// 请补全代码
    return (S.top-S.base);
}

Status StackTraverse(SqStack S)
{
// 从栈顶到栈底依次输出栈中的每个元素
    SElemType *p  = S.top;        //请填空
    if(S.top==S.base)printf("The Stack is Empty!"); //请填空
    else
    {
        printf("The Stack is: ");
        while(S.top!=S.base)            //请填空
        {
            p--;               //请填空
            printf("%d ", *p);

        }
    }
    printf("\n");
    return OK;
}

int In(char ch)
{
    switch(ch)
    {
    case'+':
    case'-':
    case'*':
    case'/':
    case'(':
    case')':
        return 1;
    default :
        return 0;
    }
}


char Operate(char first,char a,char second)
{
    switch(a)
    {
    case'+':
        return first+second;
    case'-':
        return first-second;
    case'*':
        return first*second;
    case'/':
        if(second!=0)
            return first/second;
    default:
            return ERROR;
    }
}
int evaluateExpression(char exp[])
{
    SqStack OPND;
    InitStack(OPND);  //运算数栈、运算符栈
    SElemType a,b,x,X1;
    char ch; //读取字符的变量
    int i=0; //指向存放表达式数组的下标指针(其实不是真正的指针,而是数组下标)
    ch=exp[i++]; //ch读取字符数组第一个元素,并将指针i后移一位
    while(ch!='@')
    {
        if(In(ch)) //判断ch是否为操作符
        {
                Pop(OPND,b);
                Pop(OPND,a);
                Push(OPND,Operate(a,ch,b));
                ch=exp[i++];
        }
        else if(isdigit(ch)) //判断是否为数字
        {
            X1=ch-'0';
            Push(OPND,X1);
            ch=exp[i++];
        }
        else if(ch==' ') //判断是否为空格
        {
            while(ch==' ') //跳过若干个空格
            {
                ch=exp[i++]; //忽略空格,直接取下一位
            }

        }
        else //若不是上述三种情况之一,则为非法字符
        {
            return ERROR; //返回错误提示
        }
    }
    return(GetTop(OPND)); //最后返回操作数栈顶为运算结果
}

int main()
{
    char a[100];
    gets(a);

    printf("%d",evaluateExpression(a));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值