算术表达式求值的算符优先算法

表达式求值【C语言实现】数据结构实验 表达式求值【C语言实现】数据结构实验 实验内容 表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。 实验要求 基本要求:以字符序列的形式从键盘输入语法正确的,不含变量的整型表达式。利用教科书表 3.1 给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例 3.1 演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。 实现提示 1 设置运算符栈和运算数栈辅助分析算符优先关系。 2 在读入表达式的字符序列的同时 阅读详情
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>


#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

#define STACK_INIT_SIZE 10
#define STACKINCREMENT 2


typedef int Status;
typedef int Boolean;
typedef int SElemType;



typedef struct SqStack
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

Status InitStack(SqStack *S)
{
    (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!(*S).base)
        return (OVERFLOW);
    (*S).top=(*S).base;
    (*S).stacksize=STACK_INIT_SIZE;
    return OK;
}



Status GetTop(SqStack S,SElemType *e)
{
    if(S.top>S.base)
    {
        *e=*(S.top-1);
        return OK;
    }
    else
        return ERROR;
}

Status Push(SqStack *S,SElemType e)
{
    if((*S).top-(*S).base>=(*S).stacksize)
    {
        (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!(*S).base)
            return(OVERFLOW);
        (*S).top=(*S).base+(*S).stacksize;
        (*S).stacksize+=STACKINCREMENT;
    }
    *((*S).top)++=e;
    return OK;
}

Status Pop(SqStack *S,SElemType *e)
{
    if((*S).top==(*S).base)
        return ERROR;
    *e=*--(*S).top;
    return OK;
}


SElemType Precede(SElemType t1,SElemType t2)
{
    SElemType f;
    switch(t2)
    {
    case '+':
    case '-':if(t1=='('||t1=='=')
                 f='<';
             else
                 f='>';
        break;
    case '*':
    case '/':if(t1=='*'||t1=='/'||t1==')')
                 f='>';
             else
                 f='<';
        break;
    case '(':if(t1==')')
             {
                 printf("ERROR1\n");
                 return(ERROR);
             }
             else
                 f='<';
        break;
    case ')':switch(t1)
             {
    case '(':f='=';
        break;
    case '=':printf("ERROR2\n");
        return(ERROR);
    default: f='>';
             }
             break;
    case '=':switch(t1)
             {
    case '=':f='=';
        break;
    case '(':printf("ERROR2\n");
        return(ERROR);
    default: f='>';
             }
    }
    return f;
}

Status In(SElemType c)
{
    switch(c)
    {
    case'+':
    case'-':
    case'*':
    case'/':
    case'(':
    case')':
    case'=':return TRUE;
    default:return FALSE;
    }
}

SElemType Operate(SElemType a,SElemType theta,SElemType b)
{
    SElemType c;
    switch(theta)
    {
    case'+':c=a+b;
        break;
    case'-':c=a-b;
        break;
    case'*':c=a*b;
        break;
    case'/':c=a/b;
    }
    return c;
}

SElemType Evaluateexpression_r()
{
    SqStack OPTR,OPND;
    SElemType a,b,d,x,theta;
    char c;
    char z[10];
    int i;
    InitStack(&OPTR);
    Push(&OPTR,'=');
    InitStack(&OPND);
    c=getchar();
    GetTop(OPTR,&x);
    while(c!='='||x!='=')
    {
        if(In(c))
            switch(Precede(x,c))
        {
            case'<':Push(&OPTR,c);
                c=getchar();
                break;
            case'=':Pop(&OPTR,&x);
                c=getchar();
                break;
            case'>':Pop(&OPTR,&theta);
                Pop(&OPND,&b);
                Pop(&OPND,&a);
                Push(&OPND,Operate(a,theta,b));
        }
        else if(c>='0'&&c<='9')
        {
            i=0;
            do
            {
                z[i]=c;
                i++;
                c=getchar();
            }while(c>='0'&&c<='9');
            z[i]=0;
            d=atoi(z);
            Push(&OPND,d);
        }
        else
        {
            printf("ERROR3\n");
            return(ERROR);
        }
        GetTop(OPTR,&x);
    }
    GetTop(OPND,&x);
    return x;
}

void main()
{
    printf("请输入算术表达式,负数要用(0-正数)表示,并以=结束\n");
    printf("%d\n",Evaluateexpression_r());
}


【求值】算符优先法对算术表达式求值 算符优先法对算术表达式求值 阅读详情

相关推荐

算符优先文法处理判断算术表达式的正确性

算符优先文法处理判断算术表达式源代码、说明文档、输入输出详细说明及截图

利用算符优先级实现表达式的求值

利用算符优先级实现表达式的求值

weixin_53472920的博客 2382

算符优先算法进行表达式求值

使用操作符栈和操作数栈,算符优先算法进行表达式求值

java实现表达式求值(算符优先算法,可计算int,double,float 形数据)

1.首先要实现一个运算符关系表(根据运算符的优先权生成) import java.util.ArrayList; public class RuleTable { //此表可添加 //操作符 static public char[] op = { '+', '-', 'x', '/', '(', ')', '#' }; //优先关系

sgilec的专栏 2315

用算符优先法对算术表达式求值

基于运算符栈和运算数栈,利用算符优先法对输入的中缀表达式求值。

算符优先文法处理算术表达式

实验目的:算术表达式的文法(你可以根据需要适当改变): E→E+E|E-E|E*E|E/E|(E)|i 根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确。 程序要求: 程序输入/输出示例: 如参考C语言的运算符。输入如下表达式(以#为结束)和输出结果: (1)10# 输出:正确

表达式求值(数据结构栈,c语言版)

严蔚敏数据结构(C语言版)第2版,数据结构栈,课本第79页表达式求值实验。

Linux518的博客 2万+

二、时间序列的预处理

一般情况下,拿到一个观察值序列之后,首先要对它的平稳性和纯随机性进行检验,这两个重要的检验称为序列的预处理。根据检验的结果可以将序列分为不同的类型,对不同类型的序列我们会采用不同的分析方法。 一、平稳性检验 1、特征统计量 (1)概率分布           数理统计的基础知识告诉我们分布函数或者密度函数能够完整地描述一个随机变量的统计特征。同样,一个堆积变量族{Xt} 的统计特征也完全由...

Nicole的博客 2万+

利用栈来实现算术表达式求值

通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数要给出其实现过程: (1) 函数In©:判断c是否为运算符; (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级; (3) 函数Operate(a,theta,b):对a和b进行二元运算theta。 程序运行时,输入合法的算术表达式(中间值及最终结果要在0~9之间,可以包括加减乘除和括号) #include<stdio.h> #include<string.h> #inc

u011256974的博客 6883

ConnectionResetError 10054 根因分析与全链路防御指南

ConnectionResetError(错误码10054)是TCP协议中服务端主动发送RST包导致的强制断连,本质并非网络连接失败,而是服务端基于空闲超时、连接满载、TLS协商失败等策略做出的确定性终止决策。理解其底层原理有助于跳出‘重试’误区,转向连接生命周期管理。该错误高频出现在HTTP长连接、WebSocket、第三方API对接等场景,尤其在Nginx反向代理、负载均衡器(如AWS ALB)、WAF设备及内核conntrack机制下极易触发。本文结合Wireshark抓包分析、客户端心跳保鲜、协议指

weixin_30225755的博客 637

STM32内存大小与地址的对应关系以及计算方法

1、概述 在计算机中要访问存储区,都是通过地址来进行访问的,包括所有的外设(比如串口、内存、硬盘等),都对应有一个访问地址,地址就相当于门牌号,有了门牌号,我们才知道操作的是哪一个区域、哪一个外设。 最被大家熟知的是计算机内存,计算机内存有4G、8G,16G等等,对于程序员而言,要在代码中操作这些内存,肯定得知道内存的地址,此外,还需要会计算地址与内存大小的计算方法与对应关系。STM32作为微

Ace's Blog 4万+

7-3 算术表达式求值(栈)

本题要实现对输入的表达式进行运算求解,题目为函数补全题,请补全第二部分代码,栈的基本操作,一共包含8个栈操作函数。补全代码后,将所写代码与题目中已给出的其他部分代码一同提交,运行测试。

Kg2813026978的博客 3648

鸿蒙进阶——HDI及IDL硬件接口IPC框架小结

HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信

最美不过,心中有梦,身旁有你! 3903

算符优先算法

为了实现算符优先算法,可以实用两个工作栈。一个称作OPTR,用于寄存运算符;另一个称作OPTNCVD,用于寄存操作数或运算结果。算法的思想是: 1)首先置操作数栈为空栈,表达式起始符“#”为运算符的栈底元素; 2)依次读入表达式中每一个字符,若是操作数则进OPND栈,若是运算符,则和OPTR栈的栈顶运算符比较优先权后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符...

weixin_30764137的博客 1114

【智能车Code review】—曲率计算、最小二乘法拟合

【1】曲率计算函数 选三个点计算曲率 float process_curvity(byte x1, byte y1, byte x2, byte y2, byte x3, byte y3) { float K; int S_of_ABC = ((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)) / 2; //面积的符号表示方向 byte q1 = (byte)((x2 - x1) * (x2 - x1) + (y2 - y1) *

hanhan的博客 1万+

超越防抖:索尼CXD5254GG芯片如何重新定义电子影像稳定

索尼CXD5254GG芯片通过融合6轴IMU与图像传感器数据,重新定义了电子影像稳定技术。其核心突破在于实时地平线校正、抑制果冻效应和镜头畸变校正,并搭载智能画质控制器提升画面细节。该芯片适用于广播制作、体育娱乐、安防监控和机器人视觉导航等专业领域,提供开箱即用的优化参数配置,大幅缩短开发周期。CXD5254GG不仅实现稳定成像,更通过姿态感知与智能优化,为专业影像应用提供了完整的稳定解决方案。

致力于lidar应用开发 114

数据结构 实验三 算术表达式求值 栈的基本操作

数据结构 算式表达式求值 栈的基本操作

m0_51308557的博客 8428

【七.三维视觉与视频分析】【1.点云处理:PointNet++/PointTransformer】

各位老铁,今天咱们要聊的可不是普通的二维图像处理,而是三维视觉领域最硬核的技术——点云处理。从最早的PointNet到如今的PointTransformer,这场技术进化堪比三维版的"像素革命"。今天咱们就深入解剖两大里程碑:PointNet++和PointTransformer,保证让你看完全文就能在点云领域横着走!想象一下,你抓了把沙子撒在空中,每粒沙子的位置都是三维坐标——这就是点云的典型形态。最后送大家一句话:点云处理就像在三维宇宙中寻找星辰的轨迹,既要望远镜的宏观视野,也要显微镜的细致入微。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 473

数据结构第二次作业(表达式求值【栈模拟】)

实验题目:栈的应用-算术表达式求值                                          实验目的 : 1 .掌握栈的定义及实现; 2 .掌握利用栈求解算术表达式的方法。 实验内容: 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数要给出其实现过程: (1)

_Somethingwill 1万+

图解电动汽车:电动汽车的分类

前面《电动汽车简介》中简单介绍了电动汽车的分类,主要包括混合动力电动汽车(HEV)和纯电动汽车(BEV)两大类。其中,混合动力汽车又可分为非插电式混合动力汽车、插电式混合动力汽车(PHEV)以及增程式电动汽车(REEV)。 主要分类 简单来说,各类电动汽车的特点如下。 纯电动汽车(BEV)就是指动力来源完全由电能提供,由电动机驱动的汽车,并且电能储存在电池中。 混合动力汽车(HEV)则是指动力来源可以是化石燃料,也可以是电能,并且电能除了可以存储在电池中,还可以由化石能源转化而来。 非插电式混合动力汽车

程序员「阿基米东」的编程之旅 3088

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

数据结构实验课:实验三、栈的实现及应用

一、实验目的 1.掌握栈的存储表示和实现 2.掌握栈的基本操作实现。 3.掌握栈在解决实际问题中的应用。 二、实验要求 问题描述:设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。 (1)输入的形式:表达式,例如2*(3+4)# 包含的运算符只能有’+’ 、’-’ 、’’ 、’/’ 、’(’、 ‘)’,“#”代表输入结束符; (2)输出的形式:运算结果,例如2(3+4)=14; (3)程序所能达到的功能:对表达式求值并输出。 三、解题参考思路 为了实

listboy的博客 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

学习笔记------数据结构(C语言版)栈应用 表达式求值

//main.cpp #include "predefined.h" #include "SqStack.h" SElemType EvaluateExpression(); SElemType GetTop_OPTR(SqStack S); Status In(SElemType c); SElemType Precede(SElemType c1,SElemType c2); SElemT

笑对人生Charles的专栏 1499

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数据结构:表达式求值

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

weixin_43979847的博客 3万+

实验2 表达式求值

一、题目 编制一个表达式求值的程序。 二、需求分析       本程序在Windows环境下用用Visual C++编写,要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值 首先要了解算术四则运算的规则。即:     1)先乘除,后加减;     2)从左算到右; 3)先括号内,后括号外。 算符优先法就是根据这个运算优先关系的规定来实现对表达式的编译或解释执行的。

玮哥的博客 1413

(数据结构实验)栈的应用-算术表达式求值

实验目的: 1.掌握栈的定义及实现; 2.掌握利用栈求解算术表达式的方法。   实验内容: 通过修改完善教材中的算法3.22,利用栈来实现算术表达式求值的算法。 对算法3.22中调用的几个函数要给出其实现过程: (1) 函数In(c):判断c是否为运算符; (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级; (3) 函数Operate(a,theta,b):...

烟敛寒林的博客 1万+

数据结构课程设计---------用栈来实现表达式求值

数据结构课程设计---------用栈来实现表达式求值

fguihbfg的博客 2024
上一篇: CSU 1098 Happy watering
下一篇: Hdu 1501 Zipper
Magic_____
博客等级 码龄14年 11粉丝 160原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值