1331:【例1-2】后缀表达式的值

简介: 1331:【例1-2】后缀表达式的值

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. }

 

相关文章
|
3月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
84 3
|
8月前
|
索引
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
70 0
1358:中缀表达式值(expr)
1358:中缀表达式值(expr)
180 0
|
8月前
leetcode-6116:计算布尔二叉树的值
leetcode-6116:计算布尔二叉树的值
79 0
|
存储
中缀表达式转化为后缀表达式
中缀表达式转化为后缀表达式
126 0
|
算法
不使用+或-运算符,计算两数之和
不使用+或-运算符,计算两数之和
92 0
|
搜索推荐
每日一题——两数之和(返回下标和返回数值两种情况)
每日一题——两数之和(返回下标和返回数值两种情况)
|
存储 算法
逆波兰表达式:计算包含括号的四则运算表达式
平时我们进行数学计算使用的常见书写方式就是中缀表达式,即每一个运算符号都位于计算数的中间,如下: (1+2)\3 而这对于计算机进行求取结果来说,并不是一个最优的方案。
135 0
剑指offer 19. 表示数值的字符串
剑指offer 19. 表示数值的字符串
49 0