资源简介
带有变量的中缀表达式是常见的数学表达式。如果规定变量由长度不超过 8 个小写字母组成;end为保留字,表示程序段结束;用?表示输出指定变量的值,则可以设计出比较复杂的表达式(即一个可顺序执行语句序列)。例如,如果有如下语句段:
abc=10
def=8
c=abc+def
abc=abc+5-c*2
? c
? abc
end
则输出为:
c=18
abc=-21
注意:为了简化编程实现,运算符只有+,-,*,/ ,%和^(指数运算),可以处理圆括号(),并假定输入的算术表达式正确。
要求:使用栈结构实现。
输入:表达式序列
输出:全部指定变量的值
表达式中的全部计算结果均为整数。如果在计算过程中出现除数为0的情况,则输出:Divide 0.
特殊情况说明:
在表达式中,如果操作数出现负数(例如-8),则要特别注意。例如:
10加-8表示为:10+-8。
10减-8表示为:10--8。
代码片段和文件信息
#include
#include
#include
typedef struct
{
char c[20];
int number;
}store;
store data[500];
typedef struct
{
int num[500];
int top;
}opnd;
opnd s1;
typedef struct
{
char operate[500];
int top;
}oper;//运算
oper s2;
char pri[9][10]=
{
“>><<<<<>>“
“>><<<<<>>“
“>>>><><>>“
“>>>><><>>“
“>>>><><>>“
“>>>><><>>“
“<<<<<<<= “
“>>>>>> >>“
“<<<<<<< =“
};
int push1(opnd sint n)
{
s1.num[s1.top]=n;
s1.top++;
}
int push2(oper schar c)
{
s2.operate[s2.top]=c;
s2.top++;
}
int pop1(opnd s)
{
int n;
s1.top--;
n=s1.num[s1.top];
return n;
}
char pop2(oper s)
{
char c;
s2.top--;
c=s2.operate[s2.top];
return c;
}
int signswitch (char a)
{
char signs[]={‘+‘‘-‘‘*‘‘/‘‘^‘‘%‘‘(‘ ‘)‘‘#‘‘\0‘};
int k=0;
while (signs[k]!=‘\0‘&&signs[k]!=a)
k++;
if (signs[k]==a) return k;
else return -1;
}
char judge(char achar b)
{
return pri[signswitch(a)][signswitch(b)];
}
int calculate(int xint ychar a)
{
switch(a)
{
case ‘+‘: return x+y;
case ‘-‘: return x-y;
case ‘*‘: return x*y;
case ‘/‘: if(y) return x/y;
else {printf(“Divide 0.\n“);return (12345);}
case ‘%‘: return (long int) fmod(xy);
case ‘^‘: if (y>=0 ) return (long int) pow(xy);
else return (0);
default: printf(“Error No. 3\n“);
return 0;
}
}
int main()
{
char str[500]temp0[20]temp1[20]temp2[20]count;
int i=0j=0k=0l=0flag=0sign=1num1num2sum=0result;
push2(s2‘#‘);//运算符最底下#
gets(str);
strcat(str“#“);
while(strcmp(str“end#“))//strcmp比较两个字符串 判断是否结束
{
i=0;
j=0;
flag=0;
sign=1;
sum=0;
int len=strlen(str);
while(str[i]!=‘#‘||s2.operate[s2.top-1]!=‘#‘)
{
if(flag==0)
{
if(str[i]>=‘a‘&&str[i]<=‘z‘)
{ temp0[j]=str[i];j++;i++;}//存储变量
else if(str[i]==‘=‘)
{ flag=1;temp0[j]=0;j=0;i++;}
else if(str[i]==‘?‘)
{
for(k=i+2;k { temp2[j]=str[k];j++;}
temp2[j]=0;
j=0;
i=len-1;
for(k=0;k if(strcmp(temp2data[k].c)==0)
- 上一篇:北航C语言课件2010考研机试资料
- 下一篇:VC6使用GDI+
评论
共有 条评论