概要:主要以c语言为例对数据结构中写一个简易的计算器(计算整数间加减乘除括号运算)的算法进行大致讲述,细说如何去实现符号优先级的比较的函数实现。
注:由于编辑器缘故,本文内我以小写x代替了*作为乘号
栈的相关内容:https://blog.csdn.net/weixin_44579240/article/details/89255974
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;
}
这个函数中我使用c作为反馈指令的媒介,函数返回值为c,而c的不同值代表不同的指令情况: 0.结束运算 1.弹出符号进行运算 2.符号搁置进栈 3.删除当前元素及栈顶元素(俩括号相遇) 4.报错(读到无法识别的字符) 。只需要在主函数中使用一个switch函数接受这个指令并对应执行即可。
if(*p<='9'&&*p>='0')
{
a=a*10+(*p-'0');
if(*(p+1)>'9'||*(p+1)<'0')
{
*p4++=a;
a=0;
}
p++;
}
其中p是指向算术表达式的指针,p4是指向数字栈的指针
ok,大致所需要注意的事项就是这些了,下面是我的完整代码:
#include
#include
#include
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;
double *p3,*p4,a=0,b=0;
char *p1,*p2;
char stack1[20]; //符号栈 栈顶指针p2,栈底指针p1
double stack2[20]; //数字栈 栈顶指针p4,栈底指针p3
p1=p2=stack1;
p3=p4=stack2;
*p2++='#';
printf("请输入需要计算的算术表达式:");
gets(str);
strcat(str,"#");
while(*p!='\0')
{
if(*p<='9'&&*p>='0')
{
a=a*10+(*p-'0');
if(*(p+1)>'9'||*(p+1)<'0')
{
*p4++=a;
a=0;
}
p++;
}
else
{
switch(Preemption(*p,*(p2-1)))
{
case 0:
printf("计算结果为:%lf\n",*p3);
p++;
break;
case 1:
b=*--p4;
switch(*(--p2))
{
case '+':*(p4-1)=*(p4-1) + b;break;
case '*':*(p4-1)=*(p4-1) * b;break;
case '-':*(p4-1)=*(p4-1) - b;break;
case '/':*(p4-1)=*(p4-1) / b;break;
}
break;
case 2:
*p2++=*p++;
break;
case 3:
p++;
p2--;
break;
case 4:
printf("程序读到了无法计算的符号,出错了\n");
p++;
break;
}
}
}
return 0;
}