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

栈的典型实例问题——后缀表达式(逆波兰记号)的计算

时间:2019-06-07 13:14:00      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:int   入栈   运算   ios   注意   ==   pac   color   stream   

//编译程序一般使用后缀表达式求解表达式的值(RPN或者逆波兰记号)
//计算后缀表达式的过程为:扫描,如果该项是操作数,压栈;如果是操作符,则从栈中退出两个操作数(先退出的是右操作
//),进行运算,并将运算结果重新压入栈中,扫描完后栈顶存放的就是计算结果
//注意的地方:是否支持2位以上的操作数
//操作数之间也肯定是有分割符的;
//比如:12 34 56 * +
//如果是123456*+,不管是人还是计算机,都是没法做的;

 1 #include<iostream>
 2 #include<stack>
 3 #include<stdlib.h>//atoi()函数
 4 using namespace std;
 5 int main(){//能计算99位操作数,且输入的各项要有分隔符 eg:1 2 + 3 4 - * #
 6     char s[100];//操作数或者操作符 
 7     stack<int>z;//操作数栈 
 8     int a,b;//操作数 
 9     while(cin>>s&&s[0]!=#){
10 //    while(cin>>s&&s!="#"){//不能用,想一想为什么!!!
11         if(s[0]==+){//加法,s[0]用的很妙!同理不能用s=="+",想一想为什么!!!
12             b=z.top();   
13             z.pop();
14             a=z.top();
15             z.pop();
16             z.push(a+b);
17         }
18         else if(s[0]==-){//减法
19             b=z.top();
20             z.pop();
21             a=z.top();
22             z.pop();
23             z.push(a-b);             
24         }
25         else if(s[0]==*){//乘法
26             b=z.top(); 
27             z.pop();
28             a=z.top();
29             z.pop(); 
30             z.push(a*b);
31         }
32         else if(s[0]==/){//除法
33            b=z.top();
34            z.pop();
35            a=z.top();
36            z.pop(); 
37            z.push(a/b);
38         } 
39         else z.push(atoi(s));//操作数
40     }
41     cout<<z.top();//扫描完后栈顶存放的就是计算结果
42     return 0;
43 } 

 

栈的典型实例问题——后缀表达式(逆波兰记号)的计算

标签:int   入栈   运算   ios   注意   ==   pac   color   stream   

原文地址:https://www.cnblogs.com/TYXmax/p/10987940.html

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