As we all know, c语言数据结构中的四则运算一直是一个常点,比较重要,是初学者一个必敲的代码,下面我罗列了四种数据结构四则运算,先从书(严老师)上到扩展;
严老师的数据结构上的四则运算思路是:
初始化OPTR与OPND栈(分别存储运算符号,数字),将表达式起始符 # 压入OPTR
当表达式没有扫描完毕或OPTR的栈顶元素不为#时,循环
若ch不是运算符,压入OPND,读入下一个字符;
若ch是,根据循环条件:OPTR的栈顶元素与优先级进行比较,做不同的处理
若是小于,ch压入OPTR,下一个
若是大于,弹出OPTR栈顶运算符,弹出OPND两个数,进行相应运算,压入OPND
若是对于,则OPTR栈顶元素是“(”且ch是 “)”,弹出OPTR栈顶“(”,即括号匹配成功,读入下一个
OPND栈顶元素即为表达式求值结果,返回此元素
其代码是:
char EvaluateExpression()
{
InitStack(OPTR);
InitStack(OPND);
push(OPTR,’#’);
cin>>ch;
while(ch!=’#’||GetTop(OPTR)!=’#’)
{
if(!In(ch))
{
push(OPND,ch);
cin>>ch;
}
else
switch(Precede(GetTop(OPTR),ch))
{
case’<’:
push(OPTR,ch);
cin>>ch;
break;
case’>’:
Pop(OPTR,theta);
Pop(OPND,a);Pop(OPND,b);
Push(OPND,Operate(a,theta,b));
break;
case’=’:
Pop(OPTR,x);
cin>>ch;
break;
}
}
return GetTop(OPND);
}
我们扩展一下就得到了一个能运行四则运算的正常代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char EvaluateExpression()
{
InitStack(OPTR);
InitStack(OPND);
push(OPTR,'#');
cin>>ch;
while(ch!='#'||GetTop(OPTR)!='#')
{
if(!In(ch))
{
push(OPND,ch);
cin>>ch;
}
else
switch(Precede(GetTop(OPTR),ch))
{
case'<':
push(OPTR,ch);
cin>>ch;
break;
case'>':
Pop(OPTR,theta);
Pop(OPND,a);Pop(OPND,b);
Push(OPND,Operate(a,theta,b));
break;
case'=':
Pop(OPTR,x);
cin>>ch;
break;
}
}
return GetTop(OPND);
}
int main()
{
char a[];
gets(a);
printf("%d",EvaluateExpression(a));
return 0;
}
>
其中函数In是判定读入的字符ch是否为运算符,Precede是判定运算符栈的栈顶元素与读入的运算符之间优先关系的函数,Operate为进行一元运算的函数
我们从书上的思路再延申再扩展一下,就得到了下面的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int Preemption(char a,char b) //符号优先级比较,a为当前读入,b为栈顶元素
{
int c; //c反馈指令信息 0.结束 1.弹出 2.进栈 3.删除当前元素及栈顶元素 4.报错
switch(a)
{
case '#':if(b=='#') c=0;
else c=1;break;
case '+':if(b=='#'||b=='(') c=2;
else c=1;break;
case '-':if(b=='#'||b=='(') c=2;
else c=1;break;
case '*':if(b=='*'||b=='/') c=1;
else c=2;break;
case '/':if(b=='*'||b=='/') c=1;
else c=2;break;
case '(':c=2;break;
case ')':if(b=='(') c=3;
else c=1;break;
default :c=4;break;
}
return c;
}
int main()
{
char str[50]={
"\0"};
char *p=str;
int *p3,*p4,a=0,b=0;
char *p1,*p2;
char stack1[20]; //符号栈 栈顶指针p2,栈底指针p1
int stack2[20]; //数字栈 栈顶指针p4,栈底指针p3
p1=p2=stack1;
p3=p4=stack2;
*p2++='#';
gets<

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



