c语言用栈计算算术表达式,求教!!
发布网友
发布时间:2022-05-21 23:37
我来回答
共2个回答
热心网友
时间:2023-11-18 18:25
以前写过的,你看看这个吧 也许有帮助
这个程序可以处理括号,需要编译原理的知识,祝顺利。
#include "stdio.h"
#include "stdlib.h"
/*created by http://hi.baidu.com/dannie007zxl at 2009-09-17*/
char s[50]; //符号栈
int tops;
float d[100]; //数据栈
int topd;
char number[10]; //数据转换
int num;
char c;
int token[7][7]={{1,1,-1,-1,-1,1,1}, //运算符号优先级表
{1,1,-1,-1,-1,1,1},
{1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1},
{-1,-1,-1,-1,-1,0,2},
{1,1,1,1,2,1,1},
{-1,-1,-1,-1,-1,2,0}};
int change(char x) //将运算符号转换成下标数字
{
switch(x)
{
case '+': return 0;
case '-': return 1;
case '*': return 2;
case '/': return 3;
case '(': return 4;
case ')': return 5;
case '#': return 6;
}
}
void calculate() //计算当前符号的左右
{
float a,b;
b=d[--topd];
a=d[--topd];
switch(s[--tops])
{
case '+': d[topd++]=a+b;return;
case '-': d[topd++]=a-b;return;
case '*': d[topd++]=a*b;return;
case '/': d[topd++]=a/b;return;
}
}
int expression() //处理表达式
{
int i,j;
tops=0;
s[tops++]='#';
topd=0;
c=getchar();
while(c!='#'||s[tops-1]!='#') //当都为#时 停止
{
num=0;
if(c>='0'&&c<='9') //读取数字
{
do
{
number[num++]=c;
c=getchar();
}while(c>='0'&&c<='9');
number[num]='\0';
d[topd++]=atof(number);
}
else
{
j=change(c);
i=change(s[tops-1]);
switch(token[i][j]) //查找运算符号表
{
case -1: s[tops++]=c;
c=getchar();
break;
case 0: tops--;
c=getchar();
break;
case 1: calculate();
break;
}
}
}
printf("%.2f",d[topd-1]); //输出结果
getchar();
}
int main()
{
int i;
printf(" ------计算表达式------\n使用说明:\n");
printf(" 请输入要计算的表达式,以#结尾\n");
expression();
getchar();
getchar();
}
参考资料:http://zhidao.baidu.com/question/116784397.html
热心网友
时间:2023-11-18 18:26
我看了下你的程序,好像错误有一些的,逻辑上的错误也有一些.
可以设两个栈,一个保存符号,用char型的,一个保存数字,用int型的;方便一些.
如果想深入点去研究可以去看下编译原理的那些文法LL0、LR0、LR1、SLR1...