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