YaYa很开心 2022-09-25 15:16 采纳率: 81.3%
浏览 25

PTA段错误,怎么修改

PTA一直显示段错误
题目:完成简单的数学表达式的求值问题。假设表达式仅含“加、减、乘、除”四种运算,所有运算对象均为整数。运算结果也是整数,若出现除法,则必然能整除。
输入格式:

输入一个算术运算式,以“#”结尾,其中运算数都是整型。

输出格式:

输出运算结果,运算结果也是一个整数。

输入样例:

34+75/5-4*2#

输出样例:

41

我的代码
#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct
{
    int top;
    int elem[100];
}SeqStack1;              //数据栈

typedef struct
{
    int top;
    char elem[100];
}SeqStack2;           //操作符栈

SeqStack1* Init1()
{
    SeqStack1* s=(SeqStack1*)malloc(sizeof(SeqStack1));
    s->top=-1;
    return s;
}

SeqStack2* Init2()
{
    SeqStack2* s=(SeqStack2*)malloc(sizeof(SeqStack2));
    s->top=0;
    s->elem[s->top]='#';
    return s;
}

void push1(SeqStack1* s,int x)
{
    s->top++;
    s->elem[s->top]=x;
}

void push2(SeqStack2* s,char c)
{
    s->top++;
    s->elem[s->top]=c;
}

int pop1(SeqStack1* s)
{
    int x=s->elem[s->top];
    s->top--;
    return x;
}

char pop2(SeqStack2* s)
{
    char c=s->elem[s->top];
    s->top--;
    return c;
}

int isp(char c)      //栈内优先级
{
    int x;
    if(c=='#') x=0;
    if(c=='+'||c=='-') x=2;
    if(c=='*'||c=='/') x=4;
    return x;
}

int icp(char c)     //栈外优先级
{
    int x;
    if(c=='#') x=0;
    if(c=='+'||c=='-') x=1;
    if(c=='*'||c=='/') x=3;
    return x;
}

int calculate(int a,int b,char c)
{
    int ret=0;
    switch(c)
    {
        case '+':ret=a+b;break;
        case '-':ret=a-b;break;
        case '*':ret=a*b;break;
        case '/':ret=a/b;break;
        default:break;
    }
    return ret;
}

int main()
{
    int i=0,result;
    char str[100];
    scanf("%s",str);
    int len=strlen(str);
    SeqStack1* s1=Init1();
    SeqStack2* s2=Init2();
    while(i<len)
    {
        if(str[i]!='+'&&str[i]!='-'&&str[i]!='*'&&str[i]!='/')            //多字符合并
        {
            int x=str[i]-'0';
            while(str[i+1]!='+'&&str[i+1]!='-'&&str[i+1]!='*'&&str[i+1]!='/')
            {
                x*=10;
                int y=str[i+1]-'0';
                x+=y;
                i++;
            }
            push1(s1,x);
        }
        else
        {
            if(icp(str[i])>isp(s2->elem[s2->top]))
            {
                push2(s2,str[i]);
                i++;
            }
            else if(str[i]=='#')
            {
                 while(s2->elem[s2->top]!='#')
                 {
                     int a,b;
                     char c;
                     b=pop1(s1);
                     a=pop1(s1);
                     c=pop2(s2);
                     result=calculate(a,b,c);
                     push1(s1,result);
                 }
                 result=s1->elem[s1->top];
                 printf("%d",result);
                 return 0;
            }
            else
            {
                 int a,b;
                 char c;
                 b=pop1(s1);
                 a=pop1(s1);
                 c=pop2(s2);
                 result=calculate(a,b,c);
                 push1(s1,result);
            }
        }
    }
    printf("%d",result);
    return 0;
}

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-25 17:01
    关注
    评论

报告相同问题?

问题事件

  • 创建了问题 9月25日

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)