问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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...
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...啊?我从嘴里吐出去是直的算过肺了吗?我不会从鼻子里出去_百度... 恶心呕吐是什么? 高考数学大题应注意哪些问题呢? 高考数学可不可以用高等数学啊 高考数学 基础知识点 常见考查方式 高考数学考什么内容 一般纳税人如何交所得税 以前的QQ忘记密码了那时候不要了就不找回密码了,现在想找回来,但是又没... 常州机场坐飞机流程 常州机场大巴时刻表 ...我早上九点起飞的飞机, 然后我这的机场快线大巴到机场时70分钟,_百 ... 倍耐力SVAS LR和SVAS LR1有什么区别 倍耐力轮胎上的字母LR1是什么意思 请问LR1,LR2,MR油轮是指什么? LR(0),SLR(1),LR(1)及LALR(1)等四种LR分析器的构造方法的区别 编译原理lr0和slr1的区别 公司前台背景为蓝底,请问公司名字和LOGO分别用什么颜色,请专业人士帮忙,谢谢 商务公司在设计LOGO的时候比较适合哪几种颜色? 一个镁业公司的企业LOGO,用啥颜色好? 做企业标志用什么颜色最好 老司机,一个手机怎样同时登两个 一个手机能同时登两个吗? app cloner怎么设置中文 app cloner 克隆微信后,手机提示病毒 app cloner 只能复制一个吗 app cloner有些app用不了 App Cloner怎么用?App Cloner使用说明 义乌市妙丽包装有限公司怎么样? 妙丽的鞋子是不是换风格了?感觉有变化 妙丽的鞋子适合哪些场合穿? 妙丽的鞋是什么档次 LR(0)分析中遇到的两种冲突是什么 lr0n这个英文是什么意思? 我买的红玛瑙镯子带后原来深红的地方变浅了,像扩散了一样,现在越来越鲜艳,还出现了像沉积纹一样的花纹 颜色深浅不一的是真玛瑙吗 这两种红玛瑙颜色明显不一样,成串的玛瑙颜色发红颜色较深,而单个的玛瑙颜色较浅,并且有点红里透橘色, 红玛瑙变色是什么原因 红玛瑙手镯色浅了 透了 亮了怎么回事. 梵克雅宝红玛瑙颜色一样吗 红玛瑙手镯有掉色的现象吗 歇后语和尚打伞无法无天造句 和尚打伞——无法无天怎么造句 那和尚打伞,无法无天怎么造句 用和尚打伞无法无天这个歇后语写一句话 和尚打伞&gt;&gt;&gt;无法无天 无法无天造句 和尚打伞 照小和尚打伞—无法无天写一组歇后语 解说,和尚打伞,无法无天 和尚打伞的下一句 和尚打伞,后面一句