后缀表达式求和

基本步骤:

  1. 用键盘输入一个整数后缀表达式(操作数范围只有0到9, 运算符只有+、-、*、/,中间不能有空格),使用循环程序从左到右读入表达式
  2. 如果读入的是操作数,直接进入操作数栈
  3. 如果读入的是运算符,立即从操作数栈中取出所需的操作数,计算操作数运算的值,并将计算结果存回操作数栈
//9+(3-1)*3+10/2 
#include<stdio.h>
#include<stdlib.h>
#define M 100
typedef struct//用于中缀表达式改为后缀表达式 
{
	char data[M];
	int top;
}opstack;
typedef struct
{
	float data[M];
	int top;
}stack;//用于后缀表达式 
void trans(char str[], char exp[])//用数组a储存原来的表达式,数组b储存处理后的数据 
{
	opstack op;//op为栈,用于存放运算符 
	char ch;
	int i = 0, t = 0;
	op.top = -1;//数组下标从0开始 
	ch = str[i];
	i++;
	while (ch != '\0')
	{
		switch (ch)
		{
		case'(':
			op.top++;
			op.data[op.top] = ch;//左括号入栈 
			break;
		case')':
			while (op.data[op.top] != '(')//当遇到右括号时,弹出所有的元素知道遇到左括号为止 
			{
				exp[t] = op.data[op.top];//栈顶元素出栈,放到数组 
				op.top--;
				t++;
			}
			op.top--;//左括号弹出,但不输出 
			break;
		case'+':
		case'-':
			while (op.top != -1 && op.data[op.top] != '(')
			{
				exp[t] = op.data[op.top];
				op.top--;//每次出栈元素少一个 
				t++;//数组里的元素增加 
			}
			op.top++;
			op.data[op.top] = ch;//储存该字符到栈里 
			break;
		case'*':
		case'/':
			while (op.top == '/' || op.top == '*')
			{
				exp[t] = op.data[op.top];
				op.top--;
				t++;
			}
			op.top++;
			op.data[op.top] = ch;
			break;
		case' ':                            //输入为空格,则跳过
			break;
		default:
			while (ch >= '0' && ch <= '9')
			{
				exp[t] = ch;
				t++;//数字元素直接存放到数组 
				ch = str[i];//更新ch字符的值 
				i++;//作为循环结束的条件 
			}
			i--;//循环结束后会有一个元素未出处理到 
			exp[t] = ' ';
			t++;
		}
		ch = str[i];
		i++;
	}
	while (op.top != -1)
	{
		exp[t] = op.data[op.top];
		t++;
		op.top--;//保证所有元素都处理 
	}
	exp[t] = '\0';//字符型数组的结束标志 
}
float compvalue(char exp[])                   //后缀表达式求值
{
	stack st;//字符型数字处理成浮点型,存储到st数组里 
	float d;
	char ch;
	int t = 0;
	st.top = -1;//当存入数据,数组下标就会变为零 
	ch = exp[t];
	t++;
	while (ch != '\0')
	{
		switch (ch)//所有的运算建立在数字字符已经转换完成 
		{
		case'+':
			st.data[st.top - 1] = st.data[st.top - 1] + st.data[st.top];//取出两个元素,运算后放如栈中 
			st.top--;//两个元素运算后剩下一个元素 
			break;
		case'-':
			st.data[st.top - 1] = st.data[st.top - 1] - st.data[st.top];
			st.top--;
			break;
		case'*':
			st.data[st.top - 1] = st.data[st.top - 1] * st.data[st.top];
			st.top--;
			break;
		case'/':
			if (st.data[st.top] != 0)
			{
				st.data[st.top - 1] = st.data[st.top - 1] / st.data[st.top];
				st.top--;
			}
			else
				printf("\n\t表达式中有除数为零,本次计算无效!\n");
			break;
		default:
			d = 0;//处理中转箱 
			while (ch >= '0' && ch <= '9')
			{
				d = 10 * d + ch - '0';//通过ascii码的差值将字符型数字转为整型 
				ch = exp[t];//更新ch得知,作为循环结束的条件 
				t++;
			}
			st.top++;//top的初始值为-1,数据处理前都要+1 
			st.data[st.top] = d;
		}
		ch = exp[t];
		t++;
	}
	return st.data[st.top];
}
int main()
{
	char str[M], exps[M];
	printf("\n请输入一个算术表达式:");
	printf("\n提示:操作数范围的范围是“0-9”,运算符只含+,-,*,/和括号,之间不可以有空格\n");
	gets_s(str);

	printf("\n原算术表达式为:%s\n", str);
	trans(str, exps);
	printf("\n其后缀表达式为:%s\n", exps);
	printf("\n其运算的结果为:%g\n\n", compvalue(exps));
}

代码呈现如下——
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值