c语言实现表达式计算(加减乘除四则运算和括号运算“使用 [ ] ”)

利用栈来实现表达式的计算

主函数部分:
int main()
{
node fh;
date sj;
char ch[50],z,c[6]; //ch[50]中存放表达式形成的字符串,c[6]中存放单个数据形成的字符串。
double x,y;
int i=0,j,k,n;
sj=(date
)malloc(sizeof(date));
fh=(node
)malloc(sizeof(node));
ysf[0]=’#’;
ysf[1]=’[’; //
ysf[2]=’+’; //
ysf[3]=’-’; //定义符号的优先级
ysf[4]=’*’; //
ysf[5]=’/’; //
sjchushihua(sj); //初始化
chushihua(fh);
push(fh,’#’); //将‘#’号键先行写入符号栈中
printf(“请输入要计算的数学表达式(以‘#’结束输入,括号统一使用‘[ ]’):\n”);
gets(ch); //将表达式存入字符串ch中
n=check(ch); //进行差错检测
if(n==0)
{
return 0;
}
while(ch[i]!=’#’||gettop(fh)!=’#’) //当表达式元素录入结束且运算符全部运算完毕时结束循环
{

	/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
	/*       将整数和浮点数的字符存入c[6]中,运用atof函数数据字符串转成整型或浮点型      */
    if((ch[i]=='-'&&(ch[i-1]=='['||i==0))||(ch[i]>47&&ch[i]<58))
    {
		for(k=0;k<6;k++)
			c[k]='\0';
		j=0;
		if((ch[i]=='-')&&((ch[i-1]=='[')||(i==0)))            //当数据是负数,先行录入一个‘-’号
		{
	        c[j]='-';
	        j++;
		    i++;
		}
        while((ch[i]>47&&ch[i]<58)||(ch[i]=='.'))            //将连续的数据字符存入c[6]中
		{
		    c[j]=ch[i];
			i++;
			j++;
		}
		c[j]='\0';
		sjpush(sj,atof(c));                                 //将数据字符串转化并存入数据栈
    }
	/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
    else if(ch[i]==93)                                      //当遇到‘]’时,对括号内的表达式进行运算
    {	
		while(gettop(fh)!=91)                               //当符号栈的栈顶元素是‘[’时,结束运算
		{
            z=pop(fh);
			if(z=='/'&&sjgettop(sj)==0.0)                   //当符号是‘/’时,检查除数是否为0,如果是,出错,结束运算
			{
			    printf("除数为0,错误!\n");
				return 0;
			}
            x=sjpop(sj);
            y=sjpop(sj);                                    //输出两个数据栈的元素,进行运算,将结果存入数据栈中
            x=yunsuan(x,z,y);
            sjpush(sj,x);
		}
		z=pop(fh);                                          //消去符号栈顶的‘[’
    	i++;
    }
	/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
    else
    {
        switch(compare(ch[i],gettop(fh)))                //比较当前运算符和符号栈顶元素运算符的优先级
        {
            case '>':push(fh,ch[i]);          //栈顶元素符号的优先级小
                     i++;
                     break;
            case '=':                            //栈顶元素符号的优先级大或相等
            case '<':if(ch[i]!=91)
					 {
				         z=pop(fh);	
						 if(z=='/'&&sjgettop(sj)==0)             //当符号是‘/’时,检查除数是否为0,如果是,出错,结束运算
						 {
							 printf("除数为0,错误!\n");
				             return 0;
						 }
                         x=sjpop(sj);
                         y=sjpop(sj);
						 x=yunsuan(x,z,y);                      //输出两个数据栈的元素,进行运算,将结果存入数据栈中
						 sjpush(sj,x);
						 break;
					 }
				     else
					 {
					     push(fh,ch[i]);
						 i++;
					 }
        }
    }
	/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
}	 
printf("其结果为:%lf\n",sjgettop(sj));                         //输出数据栈顶元素,即最终结果
return 0;

}

其结果如下;
在这里插入图片描述
检测错误为:
在这里插入图片描述

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一段实现加减乘除括号运算C语言代码: ```c #include <stdio.h> #include <stdlib.h> int main() { char input[100]; fgets(input, 100, stdin); // 读取用户输入 int num_stack[50]; // 存储数字的 char op_stack[50]; // 存储运算符的 int num_top = -1, op_top = -1; // 顶指针初始化为-1 int i = 0; while (input[i] != '\0' && input[i] != '\n') { // 遍历输入字符串 if (input[i] >= '0' && input[i] <= '9') { // 如果是数字 int num = 0; while (input[i] >= '0' && input[i] <= '9') { // 处理多位数字 num = num * 10 + (input[i] - '0'); i++; } num_stack[++num_top] = num; // 将数字入 } else if (input[i] == '+' || input[i] == '-') { // 如果是加减号 while (op_top >= 0 && op_stack[op_top] != '(') { // 处理乘除号 int num2 = num_stack[num_top--]; int num1 = num_stack[num_top--]; char op = op_stack[op_top--]; if (op == '+') { num_stack[++num_top] = num1 + num2; } else if (op == '-') { num_stack[++num_top] = num1 - num2; } } op_stack[++op_top] = input[i]; // 将加减号入 i++; } else if (input[i] == '*' || input[i] == '/') { // 如果是乘除号 while (op_top >= 0 && (op_stack[op_top] == '*' || op_stack[op_top] == '/')) { // 处理优先级更高的运算符 int num2 = num_stack[num_top--]; int num1 = num_stack[num_top--]; char op = op_stack[op_top--]; if (op == '*') { num_stack[++num_top] = num1 * num2; } else if (op == '/') { num_stack[++num_top] = num1 / num2; } } op_stack[++op_top] = input[i]; // 将乘除号入 i++; } else if (input[i] == '(') { // 如果是左括号 op_stack[++op_top] = input[i]; // 将左括号 i++; } else if (input[i] == ')') { // 如果是右括号 while (op_stack[op_top] != '(') { // 处理括号内的运算 int num2 = num_stack[num_top--]; int num1 = num_stack[num_top--]; char op = op_stack[op_top--]; if (op == '+') { num_stack[++num_top] = num1 + num2; } else if (op == '-') { num_stack[++num_top] = num1 - num2; } else if (op == '*') { num_stack[++num_top] = num1 * num2; } else if (op == '/') { num_stack[++num_top] = num1 / num2; } } op_top--; // 弹出左括号 i++; } else { i++; } } while (op_top >= 0) { // 处理剩余的运算 int num2 = num_stack[num_top--]; int num1 = num_stack[num_top--]; char op = op_stack[op_top--]; if (op == '+') { num_stack[++num_top] = num1 + num2; } else if (op == '-') { num_stack[++num_top] = num1 - num2; } else if (op == '*') { num_stack[++num_top] = num1 * num2; } else if (op == '/') { num_stack[++num_top] = num1 / num2; } } printf("%d", num_stack[0]); // 输出最终结果 return 0; } ``` 这段代码通过一个数字和一个运算实现运算。首先读取用户输入的字符串,然后遍历字符串,根据不同的字符进行不同的操作。如果是数字,则将其转化为整数,并入数字;如果是运算符,则将其入运算,并进行相应的运算。在处理运算符时,需要考虑运算符的优先级和括号的影响。最后,将数字中的最后一个数输出即为最终结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值