用户:
SCS_user_EHQ0z2l6el查看:6 回复:2 评论:6 创建时间:2023-04-20T21:38:09
后缀表达式,听名字感觉很高级。
事实上理解起来并不难,反而很简单。
首先,我要普及有关表达式的概念。
表达式
表达式是由操作数、运算符和界限符组成的。
听起来可能一头雾水,三个“高大上”的名词组成的更“高大上”的名词。
所谓操作数,可以分为变量和常量,比如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
SCS_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
评论
𝙲ℴ𝗌𝔦𝒹ₑ𝑟我的大致理解:
9 3 1 − 3 ∗ + 10 2 / +
//“编译”过程
9 3 1 − 3 ∗ + 10 2 / +
^ ^
//相同符号
9 3 1 − 3 ∗ +( 10 2 / )+
//一个符号对后面两个数字进行操作
9 (符号) (3-1) 3 ∗ +( 10 / 2 )+
9 (符号) ((3-1) * 3 )+( 10 / 2 )+
//剩下的一个+匹配到前面
9 + ((3-1) * 3 )+( 10 / 2 )
点赞0
评论