蓝桥杯训练 表达式计算

  算法训练 表达式计算  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定

  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

 

 

思路:数据结构实验课实现过,开两个栈一个是符号栈一个是数栈,然后依次读取输入的字符串如果是数字就转化成数并入栈,如果是运算符就比较运算符优先级进行计算,这里我们将运算符打表,然后在字符串的头和尾都增加一个#来判断边缘情况。

 

 

栈底的字符#,是用来判断第一个运算符的时候,如果不加#这是从运算符栈取出的为空,无法计算。

栈顶的字符#,是因为我们输入的字符串中的运算符经过大小比较的运算最终会剩下一个,如果没有这个末尾的#那么运算没有结束,数栈中也会剩余数,运算符栈也会剩下一个,我们增加这个#由于他的优先级最低,会将最后一个运算符计算出

PS:这里测试数据中不会再末尾输入#结束,所以我们可以通过开一个字符数组值存储# 然后通过strcat将其连在输入的字符串末尾就实现了#结束;

 

#include<stdio.h>
#include<string.h>
#include<stack>
#include<string.h>
using namespace std;
char s[110];
char pre[7][7]={
	{'>','>','<','<','<','>','>'},
	{'>','>','<','<','<','>','>'},
	{'>','>','>','>','<','>','>'},
	{'>','>','>','>','<','>','>'},
	{'<','<','<','<','<','=','0'},
	{'>','>','>','>','0','>','>'},
	{'<','<','<','<','<','0','='}};
char procede(char a,char b)
{
	int i,j;
	switch(a)
	{
		case'+':i=0;break;
		case'-':i=1;break;
		case'*':i=2;break;
		case'/':i=3;break;
		case'(':i=4;break;
		case')':i=5;break;
		case'#':i=6;break;
	}
	switch(b)
	{
		case'+':j=0;break;
		case'-':j=1;break;
		case'*':j=2;break;
		case'/':j=3;break;
		case'(':j=4;break;
		case')':j=5;break;
		case'#':j=6;break;
	}
	return pre[i][j];
}	
int operate(int m,int n,char x)
{
	if(x=='+')
	return m+n;
	if(x=='-')
	return n-m;
	if(x=='*')
	return m*n;
	if(x=='/')
	return n/m;
}
int main()
{
	int k,y;
	stack<int>shu;	
	char c;
	char ss[2]="#";
	stack<char>fu;
	fu.push('#');
	gets(s);
	strcat(s,ss); 
	c=s[0];
	k=1;
	while(c!='#'||fu.top()!='#')
	{
		y=0;
		if(c>='0'&&c<='9')
		{
			while(c>='0'&&c<='9')
			{
				y=y*10+(c-'0');
				c=s[k++];
			}
			shu.push(y);
		}
		else
		{
			switch(procede(fu.top(),c))
			{
				case'<':
					fu.push(c);
					c=s[k++];
					break;
				case'=':
					fu.pop();
					c=s[k++];
					break;
				case'>':
					char x=fu.top();fu.pop();
					int m=shu.top();shu.pop();
					int n=shu.top();shu.pop();
					shu.push(operate(m,n,x));
					break;	
			}
		}
	}
	printf("%d",shu.top());
	return 0;
}

博主个人公众号开通啦,平时主要分享一些机器学习、深度学习等的论文和方法,以及算法与数据结构、大厂经验贴等!欢迎大家关注,一起交流进步!

在这里插入图片描述

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Marcus-Bao

万水千山总是情,只给五角行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值