1331:【例1-2】后缀表达式的值
时间限制: 10 ms 内存限制: 65536 KB
【题目描述】
从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。
比如,16–9*(4+3)转换成后缀表达式为:16□9□4□3□+*–,在字符数组A中的形式为:
栈中的变化情况:
运行结果:-47
提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在264范围内,如有除法保证能整除。
【输入】
一个后缀表达式。
【输出】
一个后缀表达式的值。
【输入样例】
16 9 4 3 +*-@
【输出样例】
-47
1. #include <iostream> 2. #include <cstdio> 3. #include <cstring> 4. #include <stack> 5. using namespace std; 6. stack<long long> s; 7. char ch[260]; 8. int main(int argc, char *argv[]) 9. { 10. gets(ch); 11. int l=strlen(ch)-2; 12. long long t=0,a,b; 13. for(int i=0;i<=l;i++){ 14. if(ch[i]>='0'&&ch[i]<='9') t=t*10+ch[i]-'0'; 15. else if(ch[i]==' '){ 16. s.push(t);t=0; 17. } 18. else if(ch[i]=='+'){ 19. a=s.top();s.pop(); 20. b=s.top();s.pop(); 21. s.push(b+a); 22. } 23. else if(ch[i]=='*'){ 24. a=s.top();s.pop(); 25. b=s.top();s.pop(); 26. s.push(b*a); 27. } 28. else if(ch[i]=='-'){ 29. a=s.top();s.pop(); 30. b=s.top();s.pop(); 31. s.push(b-a); 32. } 33. else if(ch[i]=='/'){ 34. a=s.top();s.pop(); 35. b=s.top();s.pop(); 36. s.push(b/a); 37. } 38. } 39. cout<<s.top()<<endl; 40. return 0; 41. }
1. #include <iostream> 2. #include <cstdlib> 3. #include <cstdio> 4. #include <string> 5. #include <vector> 6. #include <stack> 7. #include <sstream> 8. using namespace std; 9. string calc_suffix(vector<string> &vs) 10. { 11. stringstream ss;//主要用来进行数据类型转换 12. stack<string> stk;//string类型的字符串栈 13. string ops="_+-*/"; 14. for(int i=0;i<vs.size();i++){ 15. //判断是运算符 16. if(vs[i].size()==1 && ops.find(vs[i].at(0),0)!=string::npos) 17. { 18. long long ans,a,b; 19. b=atoll(stk.top().c_str());//将数字字符串转换为数字 20. stk.pop(); 21. a=atoll(stk.top().c_str()); 22. stk.pop(); 23. switch(vs[i].at(0)){ 24. case '+': ans=a+b;break; 25. case '-': ans=a-b;break; 26. case '*': ans=a*b;break; 27. case '/': ans=a/b;break; 28. } 29. ss<<ans;// 将long long 类型的值放入输入流中(转换为 string 类型) 30. stk.push(ss.str());// 压入栈 31. ss.str("");//清空 ss 32. } 33. else stk.push(vs[i]); 34. } 35. return stk.top(); 36. } 37. int main(int argc, char *argv[]) 38. { 39. vector<string> vs; 40. char exp[255]={0}; 41. gets(exp); 42. int i=0; 43. string nums,ops; 44. ops="+-*/"; 45. while(exp[i]!='@'){ 46. if(exp[i]==' '&&nums.size()>0){ 47. vs.push_back(nums); 48. nums.clear(); 49. } 50. else if(ops.find(exp[i],0)!=string::npos){ 51. nums.append(1,exp[i]); 52. vs.push_back(nums); 53. nums.clear(); 54. } 55. else if(isdigit(exp[i])){ //判断是数字字符 56. nums.append(1,exp[i]);//字符串末尾追加 57. } 58. i++; 59. } 60. cout<<calc_suffix(vs)<<endl; 61. return 0; 62. }