数据结构:表达式求值

数据结构:表达式求值数据结构:表达式求值表达式求值是程序设计语言编译的一个最基本问题,其中任何一个表达式都是由操作数、运算符(±*/)、界限符(#,(,),[,])组成。运算符和界限符统称算符。算符的优先级关系为(数学角度上):为了通过代码实现,我们定义两个工作栈,一个叫OPTR,存运算符和界限符;另一个存OPND,存操作数或运算结果。首先OPND为空栈,OPTR首先存’#’为栈底元素。依次读取算术表达式…

大家好,又见面了,我是你们的朋友全栈君。

数据结构:表达式求值

表达式求值是程序设计语言编译的一个最基本问题,其中任何一个表达式都是由操作数、运算符(±*/)、界限符(#,(,),[,] )组成。运算符和界限符统称算符。算符的优先级关系为(数学角度上):
在这里插入图片描述
为了通过代码实现,我们定义两个工作栈,一个叫OPTR,存运算符和界限符;另一个存OPND,存操作数或运算结果。
首先OPND为空栈,OPTR首先存’#’为栈底元素。
依次读取算术表达式,如果是操作数,存OPND;如果是运算符或界限符,则和OPTR的栈顶元素比较优先级,如果优先级高,存入栈,如果优先级低,则进行运算操作。。。
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100//存储空间初始分配量 
#define STACKINCREMENT 10//分配增量
typedef int Status;
typedef char ElemType;
typedef struct{ 
   
	ElemType *base;
	ElemType *top;
	int stacksize;
}sqStack; 
Status InitStack(sqStack &s){ 
   
	s.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
	if(!s.base){ 
   
		exit(1);
	}
	s.top=s.base;
	s.stacksize=STACK_INIT_SIZE;
	return 0;
}
ElemType GetTop(sqStack s){ 
   //获取栈顶元素 
	ElemType e;
	if(s.top==s.base){ 
   
		return 0;
	}
	e=*(s.top-1);
	return e;
}
Status Push(sqStack &s,ElemType e){ 
   //插入元素e为新的栈顶元素 

	if(s.top-s.base>=s.stacksize){ 
   //如果栈满,扩充空间 
		s.base = (ElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(ElemType));
		if(!s.base){ 
   
		exit(1);
		}
		s.top=s.base+s.stacksize; 
		s.stacksize+=STACKINCREMENT;
	}
	*s.top++=e;//赋值后栈顶指针+1 
	return 0;
}
Status Pop(sqStack &s,ElemType &e){ 
   //删除栈顶元素 
	if(s.top==s.base){ 
   
		return 1;
	}
	e = *--s.top;//栈顶指针-1,给e赋值 
	return 0;
}
Status In(ElemType c){ 
   
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')'||c=='['||c==']')
        return 1;
    else
        return 0;
}//In
char Precede(ElemType a, ElemType b){ 
   //判断运算符栈的 栈顶元素a和读入元素b的优先级 
    if(a=='+'||a=='-'){ 
   
        if(b=='+'||b=='-'||b=='>'||b=='#'||b==')'||b==']')
            return '>';
        else return '<';
    }
    if(a=='*'||a=='/'){ 
   
        if(b=='('||b=='[')
            return '<';
        else return '>';
    }
    if(a=='('){ 
   
        if(b==')')
            return '=';
        else return '<';
    }
    if(a=='['){ 
   
        if(b==']')
            return '=';
        else return '<';
    }
    if(a=='#'){ 
   
        if(b=='#')
            return '=';
        else return '<';
    }
}//Precede
ElemType Operate(ElemType a, ElemType x, ElemType b){ 
   //进行运算的函数 
     switch (x){ 
   
     case '+':
         return a+b;
     case '-':
         return a-b;
     case '*':
         return a*b;
     case '/':
         return a/b;
     }
}//Operator
ElemType EvaluateExpression(){ 
   
	sqStack OPTR,OPND;//OPTR:运算符栈 OPND:运算数栈 
	char c,x;
	InitStack(OPTR);
	Push(OPTR,'#'); 
	InitStack(OPND);
	c=getchar();
	
	while(c!='#'||GetTop(OPTR)!='#'){ 
   

		if(!In(c)){ 
   
			Push(OPND,c-'0'); //不是运算符,进入运算数栈。 
			c=getchar();
		}
		else
			switch(Precede(GetTop(OPTR),c)){ 
   
				case '<':Push(OPTR,c);c=getchar();break;//栈顶元素优先级低 
				case '=':Pop(OPTR,x);c=getchar();break;//栈顶元素优先级低 
				case '>':
				Pop(OPTR,x);
				ElemType a, b;
                Pop(OPND, b);
				Pop(OPND, a);
				Push(OPND, Operate(a, x, b));
				break;
			}
	}
	return GetTop(OPND);
}
int main(){ 
   
	printf("%d",EvaluateExpression());
	return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147817.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [股票预测]股票历史数据获取[通俗易懂]

    [股票预测]股票历史数据获取[通俗易懂]一、编程环境准备第一步:安装Anaconda3;第二步:安装工具包Pandas、tusharepipinstallPandaspipinstalltushare第三步:查看Pandas、tushare版本piplistpandas1.2.4tushare1.2.64二、股票历史行情数据提取2.1获取近3年个股日线交易数据通过参数设置获取日k线、周k线、月k线,…

    2022年6月24日
    38
  • php://input allow_url_include,php allow_url_include的应用和解释_PHP教程

    php://input allow_url_include,php allow_url_include的应用和解释_PHP教程因为这个原因,许多安全研究人员建议在php.ini配置中禁用指向allow_url_fopen。不幸的是,许多推荐这种方法的人,并没有意识到,这样会破坏很多的应用并且并不能保证100%的解决remoteURLincludes以及他带来的不安全性。通常,用户要求在他们使用其他的文件系统函数的时候,php允许禁止URL包含和请求声明支持。因为这个原因,计划在PHP6中提供allow_url_inc…

    2022年7月21日
    21
  • 【通俗易懂】机器学习中 L1 和 L2 正则化的直观解释[通俗易懂]

    【通俗易懂】机器学习中 L1 和 L2 正则化的直观解释[通俗易懂]L=Ein+λ∑j|wj|L=Ein+λ∑j|wj|L=E_{in}+\lambda\sum_j|w_j|∑jw2j≤C∑jwj2≤C\sum_jw_j^2\leqC∇Ein∇Ein\nablaE_in∇Ein+λw=0∇Ein+λw=0\nablaE_{in}+\lambdaw=0∂∂w(12λw2)=λw∂∂w(12λw2)=λw\frac{\partia…

    2022年7月13日
    16
  • 数据可视化编程实战_大数据可视化

    数据可视化编程实战_大数据可视化以R可视化为桥梁经常有对比R,Python和Julia之间的讨论,似乎R语言在这三者之中是最为逊色的,实则不可一概而论。R语言在常规数据分析的场景下,如数据读入,预处理,整理,以及单机可视化方面表现出的优势,无论从用户体验,还是代码流畅度,令另两种语言略逊一筹。本文将从统计学中最基本的密度曲线的绘制,来串讲一下题目中所涉及的R语言可视化中三个强大的可视化包的用法,以及之间的联系。以此为基础,进阶高段,可以自然过渡到Python,Julia等语言的可视化实践活动中。首先引入本次实践使用的数

    2025年7月2日
    3
  • 中国首批230135个绿色电力证书核发

    中国首批230135个绿色电力证书核发

    2022年3月4日
    68
  • Shiro框架基本知识及应用「建议收藏」

    Shiro框架基本知识及应用「建议收藏」1.Shiro基本知识1.目前市面主流的安全框架:shiro:轻量级的,使用很方便,灵活,是apache提供的,在任何框架的SpringSecurity:是Spring家族的一部分,很多项目中会使用spring全家桶,相对与shiro来说,springSecurity更重量级,必须要求spring环境;相对shiro而言,功能更强大2.什么是Shiro?Shiro是apache旗下一个开源安全框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证、权限授权、加密、会话管理等功

    2025年10月8日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号