首页 > 其他分享 >表达式(二)

表达式(二)

时间:2024-08-08 15:29:28浏览次数:10  
标签:return struct int tr tok calc 表达式

后缀表达式由于其特殊性只需要操作数栈,不需要运算符栈,每当出现运算符就说明是对前面两个操作数进行操作

#include<bits/stdc++.h>
using namespace std;
char tok[30][20];
int tok_max;
int pos=1;

int main(){
	tok_max=0;
	int num1=0;
	for(;;){
		int c=getchar();
		if(c=='@')break;
		if(c=='+'||c=='-'||c=='*'||c=='/'){
			tok[++tok_max][0]=c;
		}else if(c=='.'){
			sprintf(tok[++tok_max],"%d",num1);
			num1=0;
		}else{
			num1=num1*10+(c-'0');
		}
	}
//	for(int i=1;i<=tok_max;i++){
//		puts(tok[i]);
//	}

	stack<int>st;
	for(int i=1;i<=tok_max;i++){
		//操作数
		if(isdigit(*tok[i])){ 
			int num2;
			sscanf(tok[i],"%d",&num2);
			st.push(num2);
		}
		//运算符
		else if(*tok[i]=='+'){  
			int num3=st.top();st.pop();
			int num4=st.top();st.pop();
			int num5=num4+num3;
			st.push(num5);
		}
		else if(*tok[i]=='-'){
			int num3=st.top();st.pop();
			int num4=st.top();st.pop();
			int num5=num4-num3;
			st.push(num5);
		}
		else if(*tok[i]=='*'){
			int num3=st.top();st.pop();
			int num4=st.top();st.pop();
			int num5=num4*num3;
			st.push(num5);
		}
		else if(*tok[i]=='/'){
			int num3=st.top();st.pop();
			int num4=st.top();st.pop();
			int num5=num4/num3;
			st.push(num5);
		}
		
		
	}
	
	printf("%d\n",st.top());
	return 0;
}

前缀表达式

前缀表达式用栈写相对麻烦,但由于运算符前置,可以方便地将其转化为二叉树,递归实现

#include<bits/stdc++.h>
using namespace std;
char tok[6000][30];
int tok_max;
int pos=1;

struct TREE{
	double val;
	char op;
	struct TREE *l,*r;
}tr;

void build_tree(struct TREE *tr){
	if(isdigit(*tok[pos])){
		sscanf(tok[pos],"%lf",&(tr->val));
		//tr->val=atof(tok[pos]);
		pos++;
		tr->l=NULL;tr->r=NULL;
		return;
	}
	else{
		tr->op=*tok[pos];
		pos++;
		tr->l=(struct TREE*)malloc(sizeof(struct TREE));
		tr->r=(struct TREE*)malloc(sizeof(struct TREE));
		build_tree(tr->l);build_tree(tr->r);
		return;
	}
}
/*
void x(struct TREE *tr){
	if(tr==NULL)return;
	
	x(tr->l);
	if(tr->l==NULL && tr->r==NULL){
		printf("%f ",tr->val);
	}else{
		printf("%c ",tr->op);
	}
	x(tr->r);
}*/

double calc(struct TREE *tr){
	if(tr->l==NULL && tr->r==NULL){ //是操作数
		return tr->val;
	}
	else{
		if(tr->op=='+')return calc(tr->l)+calc(tr->r);
		if(tr->op=='-')return calc(tr->l)-calc(tr->r);
		if(tr->op=='*')return calc(tr->l)*calc(tr->r);
		if(tr->op=='/')return calc(tr->l)/calc(tr->r);
	}
}

int main(){
	tok_max=1;
	for(;;){
		int num=scanf("%s",tok[tok_max]);
		if(num==EOF)break;
		tok_max++;
	}
	
	build_tree(&tr);
	
	//x(&tr);
	
	double ans=calc(&tr);
	printf("%f\n",ans);
	return 0;
}

PS:以上代码经常出现*tok[i]一类的表达,因为tok[i]可看做指向数组的指针,*tok[i]等价于tok[i][0],写起来简洁易懂

标签:return,struct,int,tr,tok,calc,表达式
From: https://www.cnblogs.com/jisuanjizhishizatan/p/18349010

相关文章

  • cron表达式
    一、插入组件安装:npminstallvue-cron--save引入:importVuefrom'vue'importElementUIfrom'element-ui';import'element-ui/lib/theme-chalk/index.css'Vue.use(ElementUI);//在main.js文件里全局引入importVueCronfrom'vue-cron......
  • Linux shell脚本案例:使用正则表达式匹配目录并定时删除日期早于当前系统日期的所有目
    实现每周三和每周日执行清理/NFS目录的任务,你可以使用shell脚本结合cron定时任务。下面是一个示例脚本,它会删除/NFS目录下所有名称形如XBK_FULL_YYYYMMDDHHMMSS和XBK_INCR_YYYYMMDDHHMMSS的目录,其中日期早于当前系统日期。步骤1:创建Shell脚本创建脚本......
  • LeetCode150 逆波兰表达式求值
    前言题目:150.逆波兰表达式求值文档:代码随想录——逆波兰表达式求值编程语言:C++解题状态:成功解答!思路还是利用栈的思想,遍历到数字时,加入栈,遍历到运算符时,取出两个数进行运算,并将结果加入到栈中。代码classSolution{public:intevalRPN(vector<string>......
  • 表达式相关(一)操作数栈、运算符栈
    NOIP2013普及组T2只有加法和乘法的表达式思考:使用tok来存放操作数或操作符(在编译器词法分析中称之为token,故简写为tok);输入只有一行可以用fgets,不知道题目给的输入文件有没有换行(fgets是会读入换行符的),所以还要加个判断,不然存放的时候会把换行符也当做运算符对于2+3+...的表达......
  • 通配符和正则表达式区别
    通配符和正则表达式区别通配符是shell自带的用于匹配文件名的工具,多用在文件名上,比如查找find,ls,cp等等。正则表达式则需要特定命令的支持才可以使用,如:grep、sed和awk(号称Linux三剑客)、vi/vim、perl等,这些都是处理文本的工具。其次,shell对通配符与正则表达式的处理也有不同,“......
  • ABAP 宿主表达式(Host Expressions)
    ABAP宿主表达式是一种在ABAP7.40及更高版本中引入的特性,‌它允许在SQL表达式的操作数位置或编写SQL语句的工作区中使用任何ABAP表达式。‌ 这种表达式通过在表达式前加上@符号来标识,‌形式为@(abap_expression)。‌宿主表达式的引入,‌使得ABAP开发者能够更灵活地在SQL查询中使用......
  • 正则表达式(分组、零宽断言)
     目录正则表达式分组捕获组编号捕获组(pattern)命名捕获组(?\<name>pattern)非捕获组(?:pattern)零宽断言先行断言零宽正向先行断言(?=pattern1)pettern2零宽负向先行断言(?!pattern1)pettern2后行断言零宽正向后行断言(?<=pattern1)petter......
  • 正则表达式
    正则表达式目录正则表达式字符通配符次数通配符字符类定位符分组和量词选择和逻辑运算符边界匹配符转义特殊字符预定义字符类字符通配符.:匹配任意单个字符(除了换行符)。次数通配符*:前一个字符的0次或多次。例如,a*可以匹配"cat"中的"c",也可以匹配"apple"中的"app"......
  • Apple开发_正则表达式相关
    NSString+Regex.h#import<Foundation/Foundation.h>//正则表达式相关@interfaceNSString(Regex)//邮箱验证-(BOOL)is_Email;//手机号码验证-(BOOL)is_Phone_Num;//车牌号验证-(BOOL)is_Car_No;//网址验证-(BOOL)is_Url;//邮政编码-(BOOL)is_......
  • 正则表达式
    正则表达式一.字符通配符字符通配符是一种在多种编程语言和工具中广泛使用的特殊字符或字符序列,它们用于匹配或比较字符串时表示一组字符的模式。字符通配符可以实现模糊匹配,使得字符串处理更加灵活和高效。在Java中,字符通配符的使用主要体现在以下几个方面:1.正则表达式中的通......