数据结构中的表达式求值
来源:互联网 发布:mac pro type c 编辑:程序博客网 时间:2024/05/29 12:20
表达式求值是数据结构中关于栈的一个应用,主要就是让计算机模拟人脑来计算表达式,这中间就不免涉及到运算符的优先级问题以及括号的处理,运算符的优先级问题,相比之下比较好解决点(我只处理了+、-、*、/、%五种操作符以及括号),在hash中定义它们的优先级,而对于括号,怎么来处理,其实你可以把有括号的表达式看成是多个表达式,相匹配的括号中看成一个表达式,然后把这里面的值求出来,一层一层向外推进,最后,就变成没有括号的表达式求值,这样,求取就简单多了。我的程序只处理了+、-、*、/、%、(、)这几种操作符,没有处理单目的操作符,中间没有对*、/、%结果溢出的处理(数据用long long存放的,计算的范围相比之下会大些),下面是具体的代码:
#include<iostream>#include<string>#include<algorithm>#define MAX_N 0x80#define MAX_M 1<<15using namespace std;int hash[MAX_N];//用于提取操作数long long draw(string& s,unsigned& pos){ long long number = 0; for(unsigned len=s.size(); pos<len&&s[pos]>='0'&&s[pos]<='9'; ++pos) number = number*10+s[pos]-48; pos--; return number;}long long calc(long long* num,int& top,char op){ long long a,b,c ; b = num[--top]; a= num[--top]; switch(op) { case '+': c = a + b; break; case '-': c = a - b; break; case '*': c = a * b ; break; case '/': if(b==0) { cout << "除数为0" << endl; exit(-1); } c = a / b; break; case '%': if(b==0) { cout << "模数为0" << endl; exit(-1); } c= a % b; } return c;}long long solve(string s){ char option[MAX_M]= {'\0'}; //操作符栈 long long num[MAX_M]= {0}; //操作数栈 int top1 = 0,top2=0; //设置栈顶 //定义优先级 hash['+'] = 1,hash['-']=1,hash['*']=2,hash['/'] = 2,hash['%'] =2,hash['(']=0; for(unsigned i=0,len=s.size(); i!=len; ++i) { if(s[i]>='0'&&s[i]<='9') { num[top2++] = draw(s,i); } else if(s[i]!=' ') { if(s[i]==')') { while(option[top1-1]!='(') { long long temp = calc(num,top2,option[--top1]); num[top2++] = temp; } //舍掉左括号 --top1; } //如果是左括号,直接进栈 else if(s[i]=='(') option[top1++] = '(' ; //当前操作符的优先级比栈顶的高或者栈为空,直接入栈 else if(!top1 || hash[option[top1-1]]<hash[s[i]]) option[top1++] = s[i]; //当前操作符优先级小于等于栈顶元素的优先级,弹栈,直到栈空或者栈顶的元素优先级大于当前的操作符 else { while(top1&&hash[option[top1-1]]>=hash[s[i]]) { long long temp = calc(num,top2,option[--top1]); num[top2++] = temp; } //将当前操作符放入操作符栈 option[top1++] = s[i]; } } } //操作符栈中可能还有操作符 while(top1) { long long temp = calc(num,top2,option[--top1]); num[top2++] = temp; } return num[0];}int main(){ string s ; getline(cin,s); long long res = solve(s); cout << res << endl ; return 0;}
- 数据结构中的表达式求值
- 数据结构 表达式求值
- 数据结构---表达式求值
- <数据结构>栈-表达式求值
- 计算器 表达式求值 数据结构
- 数据结构表达式求值
- 数据结构 表达式求值
- 数据结构_表达式求值
- 【数据结构】 之 表达式求值
- 数据结构---表达式求值
- 【数据结构】中缀表达式求值
- 数据结构课程设计-表达式求值
- 表达式求值(数据结构)
- 表达式求值 ACM 数据结构
- 数据结构课程设计 算术表达式求值
- 数据结构作业—表达式求值
- 数据结构的练习:表达式求值
- 【数据结构】复杂表达式的求值
- 编程之美:二进制中的1
- Linux内核设计艺术笔记(一)
- 弯曲的手指
- JavaIO之Stream
- 线性的时间内选择出rank n的元素
- 数据结构中的表达式求值
- tnsの設定
- JavaIO之管道(二)
- 队列的不同存储结构及JAVA实现
- 突发奇想
- CERC2012 j - Conservation 有条件的维护拓扑序列
- nandflash的操作方法
- mysql用户管理
- JavaIO之输入输出流链(一)