猫史档案馆


后缀表达式+后缀表达式求值思路(c++教学)

用户:SCS_user_EHQ0z2l6elSCS_user_EHQ0z2l6el查看:1 回复:3 评论:1 创建时间:2023-05-03T12:30:31


后缀表达式,听名字感觉很高级。

事实上理解起来并不难,反而很简单。

首先,我要普及有关表达式的概念。

 

 

 

表达式

表达式是由操作数、运算符和界限符组成的。

听起来可能一头雾水,三个“高大上”的名词组成的更“高大上”的名词。

所谓操作数,可以分为变量和常量,比如x和2。

运算符不用说,加减乘除都用过。

界限符比如左括号"("和右括号")"。

举个例子:3*2*(1+18)

就是一个表达式

 

 

 

用计算机计算表达式

问题的困难在于乘除运算的优先级高于加减运算,
并且加入了括号,
使得问题变得更加困难。
比如说:
9*(1+3)
显然不是简单的从左往右扫描,先计算9*1
20世纪50年代,
波兰逻辑学家想到了一种去扩号、区分运算符优先级的后缀表达法,
也可以称之为逆波兰表示。

 

 

后缀表达式

我们平时所见的是中缀表达式,

运算符是放在字符中间的,如a+b-c

后缀指的是运算符放在两个操作数的后面

如 a b + c -

比如

9 + (3 − 1) ∗ 3 + 10/2

用后缀表达式就是

9 3 1 − 3 ∗ + 10 2 / +

 

 

计算机是如何计算后缀表达式的?

规则是从左到右遍历表达式的每个数字和符号,遇到数字就进栈,

遇到是符号,就将处于栈顶的两个数字出栈,进行计算,

然后计算结果进栈,一直到最终获得结果。

示例:

9 3 1 − 3 ∗ + 10 2 / +

1.初始化一个空栈,用来存放要运算的数字。

栈:[]

2.后缀表达式前三项都是数字,让他们直接进栈。

[9,3,1]

3.接下来是“-”让栈顶的元素出栈,再将下一个元素出栈,后一个减前一个,结果入栈

[9,2]

中途省略

最后全部遍历完

栈里面还有一个元素20

20出栈,栈变成空。

所以这个表达式的结果就是20)

 

代码的话我会放在评论区,想要的可以去翻翻。

再见awa

 


回复

上一页1 页 / 共 1下一页
SCS_user_EHQ0z2l6elSCS_user_EHQ0z2l6el

补发一下,之前投错地方了QAQ

点赞0


评论


SCS_user_EHQ0z2l6elSCS_user_EHQ0z2l6el

//后缀表达式求值
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
stack <double> s;//栈
double popfront(){
    double a=s.top();
    s.pop();
    return a;
}
int main(){
    string x;
    while(cin>>x){
        if('0'<=x[0]&&x[0]<='9'){
            int num=stod(x);
            s.push(num);
            continue;
        }
        double a=popfront();
        double b=popfront();
        if(x[0]=='+'){
            s.push(b+a);
        }
        if(x[0]=='-'){
            s.push(b-a);
        }
        if(x[0]=='*'){
            s.push(b*a);
        }
        if(x[0]=='/'){
            s.push(b/a);
        }
    }
    printf("%.1f",popfront());
    return 0;
}

点赞0


评论


𝙲ℴ𝗌𝔦𝒹ₑ𝑟𝙲ℴ𝗌𝔦𝒹ₑ𝑟

c++有前缀表达式吗( )

点赞0


评论