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

Posted tyxmax

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的典型实例问题——后缀表达式(逆波兰记号)的计算相关的知识,希望对你有一定的参考价值。

//编译程序一般使用后缀表达式求解表达式的值(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  

 

以上是关于栈的典型实例问题——后缀表达式(逆波兰记号)的计算的主要内容,如果未能解决你的问题,请参考以下文章

栈的应用-逆波兰式

(C语言中)逆波兰算法(及计算器)

算法与数据结构--栈的应用-逆波兰计算器完整版代码

栈的应用,中后缀表达式的转换:波兰式和逆波兰式

栈的应用,中后缀表达式的转换:波兰式和逆波兰式

栈的应用之中缀表达式转化为后缀表达式(逆波兰表达式)