码迷,mamicode.com
首页 > 其他好文 > 详细

逆波兰表达式

时间:2016-04-30 18:16:25      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

逆波兰表达式:

计算给定的逆波兰表达式的值,有效操作只有加减乘除,每个操作数都为整数。

如:

"2","1","+","3","*" : 9;---------(2+1)*3

"4","13","5","/","+" : 6;---------4+(13/5)

程序实现:

 1 #include <iostream>
 2 #include <stack>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 //判断是否为运算符
 7 bool IsOperator(const char* token){
 8     return ((token[0]==+)||(token[0]==-)
 9     ||(token[0]==*)||(token[0]==/));
10 }
11 //逆波兰表达式,利用压栈出栈的方式:
12 /*
13 若当前字符为操作数,则压栈
14 若当前字符为操作符,则弹出栈中的两个操作数,进行计算后再次压入栈中
15 */
16 int ReversePolishNotation(const char* str[],int size){
17     stack<int> s;
18     int a,b;
19     const char* token;
20     for(int i=0;i<size;i++){
21         token = str[i];
22         if(!IsOperator(token))
23             s.push(atoi(token));
24         else{
25             b = s.top();
26             s.pop();
27             a = s.top();
28             s.pop();
29             if(token[0] == +)
30                 s.push(a+b);
31             else if(token[0] == -)
32                 s.push(a-b);
33             else if(token[0] == *)
34                 s.push(a*b);
35             else if(token[0] == /)
36                 s.push(a/b);
37         }
38     }
39     return s.top();
40 }
41 int main()
42 {
43     const char* str[] = {"2","1","+","3","*"};
44     const char* str1[] = {"4","13","5","/","+"};
45     int value = ReversePolishNotation(str,sizeof(str)/sizeof(const char*));
46     cout<<value<<endl;
47     cout<<ReversePolishNotation(str1,sizeof(str1)/sizeof(const char*))<<endl;
48     return 0;
49 }

运行结果:

技术分享

转载请注明出处:

C++博客园:godfrey_88

http://www.cnblogs.com/gaobaoru-articles/

 

逆波兰表达式

标签:

原文地址:http://www.cnblogs.com/gaobaoru-articles/p/5448977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!