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

 

相关文章
|
8月前
|
编译器 C++
C++下标运算符详解
使用第一种声明方式,[ ]不仅可以访问元素,还可以修改元素。使用第二种声明方式,[ ]只能访问而不能修改元素。在实际开发中,我们应该同时提供以上两种形式,这样做是为了适应 const 对象,因为通过 const 对象只能调用 const 成员函数,如果不提供第二种形式,那么将无法访问 const 对象的任何元素。下面我们通过一个具体的例子来演示如何重载[ ]。
34 0
|
10月前
1358:中缀表达式值(expr)
1358:中缀表达式值(expr)
104 0
|
10月前
|
编译器 C语言 C++
学C的第十六天【操作符详解:9. 条件操作符;10. 逗号表达式;11. 下标引用,函数调用和结构函数;12.表达式求值:整型提升、算术转换、操作符的属性;练习:使用函数完成整型函数的打印、元素逆置】-2
12.表达式求值 1. 表达式求值的顺序一部分是由操作符的优先级和结合性决定。 2. 有些表达式的操作数在求值的过程中可能需要转换为其它类型。
|
11月前
|
存储
中缀表达式转化为后缀表达式
中缀表达式转化为后缀表达式
|
11月前
|
搜索推荐
每日一题——两数之和(返回下标和返回数值两种情况)
每日一题——两数之和(返回下标和返回数值两种情况)
|
11月前
|
存储 算法
逆波兰表达式:计算包含括号的四则运算表达式
平时我们进行数学计算使用的常见书写方式就是中缀表达式,即每一个运算符号都位于计算数的中间,如下: (1+2)\3 而这对于计算机进行求取结果来说,并不是一个最优的方案。
75 0
中缀表达转后缀表达式小技巧+通过后缀表达式求值
在考研中,经常会考中缀表达转后缀表达式,那什么是中缀表达?什么是后缀表达式?我举两个例子大家一个就清楚了
中缀表达转后缀表达式小技巧+通过后缀表达式求值
108.递归整数四则运算
108.递归整数四则运算
62 0
|
算法 Java
数据结构—栈的应用举例【算术表达式求值转换、后缀表达式求值计算】
数据结构—栈的应用举例【算术表达式求值转换、后缀表达式求值计算】
142 0
数据结构—栈的应用举例【算术表达式求值转换、后缀表达式求值计算】

热门文章

最新文章