对逆波兰式(后缀表达式)求值详解
程序员文章站
2024-03-19 15:10:52
...
题目:编程对一个逆波兰式(后缀表达式)进行求值,如“435*+23*-”的结果是 13,函数的参数为字符串(后
缀表达式),假定字符串为正确的逆波兰式。
解题思路:定义一个栈对象,然后开始遍历字符串,当遇到数字时直接入栈,当遇到运算符时出栈两个元素并且出来的两个元素和那个运算符进行计算。讲计算结果再次入栈。遍历结束后栈中的值就是逆波兰式的值。
(1)定义栈:
(2)遍历字符串,第一个字符4是数字,所以直接入栈:
(3)同理后面的3和5也都是数字所以直接入栈。
(4)继续遍历字符串,遇到的运算符“*”号,这时候获取栈顶元素然后出栈,再次获取栈顶元素出栈,然后做*的运算。
也就是5和3出栈,然后算3*5,把结果放入栈中。
注意:先出来的栈顶元素是运算符右边的数字。
(5)后面又是一个运算符“+”,所以还是出栈两个元素并且进行“+”运算,然后把结果放入栈中。
(6)继续遍历,后面是两个字符是数字,一个是2,一个是3。所以直接入栈。
(7)遇到运算符“ * ”,还是老样子出栈两个元素进行*操作,将结果放入栈中。
(8)向后遍历是运算符“ - ”,老规矩出栈两个元素进行减法操作,然后把结果放入栈中。
(9)字符串遍历结束,栈中的元素便是该逆波兰式的值。
下面奉上代码部分:
#include<iostream>
#include<stack>
using namespace std;
int main()
{
char* arr="435*+23*-";//逆波兰式
stack<int> a;//栈
int left;//左操作数
int right;//右操作数
int tmp;//保存运算的结果
while(*arr!='\0')
{
if(isdigit(*arr))//判断是否为数字
{
int c=*arr-48;
a.push(c);//入栈
}
else//是运算符
{
right=a.top();//获取栈顶元素,右操作数
a.pop();//出栈
left=a.top();//获取栈顶元素,右操作数
a.pop();//出栈
if(*arr=='+')//运算符是+就执行加法
{
tmp=left+right;
}
if(*arr=='-')//执行减法
{
tmp=left-right;
}
if(*arr=='*')//执行乘法
{
tmp=left*right;
}
if(*arr=='/')//执行除法
{
tmp=left/right;
}
a.push(tmp);//把结果入栈
}
arr++;//字符串向后遍历
}
int num=a.top();//获取结果
printf("%d ",num);
}