蓝桥杯训练 表达式计算

来源:互联网 发布:存心自有天知 编辑:程序博客网 时间:2024/09/21 08:40
  算法训练 表达式计算  
时间限制: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;}



4 2
原创粉丝点击