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