数据结构:表达式求值

数据结构:表达式求值数据结构:表达式求值表达式求值是程序设计语言编译的一个最基本问题,其中任何一个表达式都是由操作数、运算符(±*/)、界限符(#,(,),[,])组成。运算符和界限符统称算符。算符的优先级关系为(数学角度上):为了通过代码实现,我们定义两个工作栈,一个叫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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • COM技术内幕–QueryInterface函数「建议收藏」

    COM技术内幕–QueryInterface函数「建议收藏」接口查询:在客户查询组件的其他接口时,也是通过接口完成的。这个接口就是IUnknown.头文件包含在Win32SDK的unknwn.h头文件中。引用如下:interfaceIUnknown{virtualHRESULT__stdcallQueryInterface(constIID&iid,void**ppv)=0;virtual

  • POJ3623:Best Cow Line, Gold(后缀数组)

    POJ3623:Best Cow Line, Gold(后缀数组)

  • 五个最佳FTP客户端工具「建议收藏」

    五个最佳FTP客户端工具「建议收藏」概述无论你是做网站工作,还是运行一个家庭FTP服务器,或者你只是喜欢高速下载,一个稳定且功能齐全的FTP客户端工具都可以节省你大量时间和生命,现在有大量的免费或者收费的FTP客户端软件供大家选择,这里总结了五个流行的FTP客户端软件。FileZilla(所有平台)FileZillaFileZilla是一个免费开源的适合Windows、Mac和Linux的FTP客户端软件,因为其实免费跨平台和易用性,因此它是很多FTP用户的最初选择,FileZilla下载速度非常快,功能齐全,如果你是Wind

  • 利用Cinemachine实现相机不穿墙效果

    利用Cinemachine实现相机不穿墙效果以前一直都是代码控制,今天看见了这个插件,真的很好用,下面我们来看看,本人用的2018.1.7版本:首先呢,导入我们想用的资源点击上头编辑,选择CreatVirtualCamera拖进去Sphere,相机会跟随并且看向他点击这个按钮,可以给相机添加很多东西,这里说碰撞体Collider这是添加后多出来的组件这时候,如果后面有一堵墙,相机不会再往后靠…

  • Github项目解析(九)–>实现Activity跳转动画的五种方式

    Github项目解析(九)–>实现Activity跳转动画的五种方式文本中我们将讲解activity切换动画相关的知识点,这里的切换动画指的是是activity跳转时的动画效果。这里总结了一下,有五种方式实现activity切换时实现动画效果。下面我将依次介绍一下每种实现activity切换动画效果的实现方式

  • 用websocket实现实时聊天功能

    用websocket实现实时聊天功能最近想实现网页版的仿QQ聊天工具,本来想用ajax实现的,但是一想到要一直轮询,就感觉有点蠢。后来在网上找到了websocket相关的资料,就拿来跟大家分享下(不是很熟练,现在只实现了群聊,单聊的前端不会写了。但可以跟大家说说思路)。服务器端代码:首先要创建类WebSocketConfig实现ServerApplicationConfig接口,ServerApplicationConfig项目…

    2022年10月21日

发表回复

您的电子邮箱地址不会被公开。

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