前缀表达式求值

目录

一、前缀表达式

一.壹、概念

一.贰、表达

一.叁、运算

二、二叉树

二.壹、引入

二.贰、概念

二.叁、初始代码

三、代码

三.壹、思路

三.贰、代码

注:此文章非出自题目,而为作者本人无聊写的


一、前缀表达式

一.壹、概念

前缀表达式又称逆波兰式,是一位波兰数学家提出的表达方式,而且对计算机很友好,不像中缀表达式一样,计算机还得一步一步看。

一.贰、表达

前缀表达式是一种符号在前,数字在后的一种表达,如 - * 2 3 5 。

一.叁、运算

前缀表达式没有先乘除后加减、先算括号等规则,只是从左往右计算,如:

   - * 2 3 5

= - 6 5

= 1

二、二叉树

二.壹、引入

有人肯能会问:为啥前缀表达式求和还要二叉树呢?因为它简单。

二.贰、概念

二叉树是指一棵树他的所有节点的子节点不超过两个。

二叉树的节点分为以下几类:根节点(通常为下标一的节点)、中间节点(有父亲节点也有子节点)、叶子节点(顾名思义,指最外面的节点,没有子节点的节点)

而二叉树又可以分为以下几个种类:普通二叉树、完全二叉树(除了最后一层,别的层都有2的层号次方个节点)、满二叉树(每层都有2的层号次方个节点)。

二.叁、初始代码

二叉树定义一般用以下代码:

struct tree{
	string value;//定义值
	int l=0,r=0;//定义左子节点和右子节点的下标
}t[1000];

三、代码

三.壹、思路

我们把运算符号看成根节点和中间节点,把数字看成叶子节点,在递归运算出结果。

三.贰、代码

#include<bits/stdc++.h>
using namespace std;
struct tree{
	string v;
	int l=0,r=0;
}t[1000];//二叉树本体,1000够用了
long long run(int x){//递归运算结果
	if(t[x].v=="+")return run(t[x].l)+run(t[x].r);
	if(t[x].v=="*")return run(t[x].l)*run(t[x].r);
	if(t[x].v=="-")return run(t[x].l)-run(t[x].r);
	int s=t[x].v.size();
	long long num=0;
	for(int i=0;i<s;i++)num=num*10+t[x].v[i]-'0';
	return num;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int i=1;//定义编号,后面有用
	string str;//输入的变量
	stack<pair<int,int>>s;//用于记这个节点是谁的子节点
	while(cin>>str){
		t[i].v=str;
		if(s.size()){//寻找父亲节点,根节点除外
			pair<int,int>u=s.top();
			s.pop();
			if(u.second==1)t[u.first].r=i;
			else{
				u.second=1;
				s.push(u);
				t[u.first].l=i;
			}
		}if(str[0]>='0'&&str[0]<='9'){if(s.empty())break;}//特判跳出
		else{//中间节点加入栈
			pair<int,int>u;
			u.first=i,u.second=2;
			s.push(u);
		}i++;//编号增加
	}cout<<run(1);//输出结果
	return 0;
}

注:此文章非出自题目,而为作者本人无聊写的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值