C++ 实现 算数表达式求值

C++实现简单表达式求值 【代码】C++实现简单表达式求值。 阅读详情

好不容易抽出点时间来复习一下数据结构和算法。

看到堆栈部分。有2道题目,第一道是计算C系列括号匹配校验。第二道是计算算数表达式。

第一道题是思路是

跳过 ' ""字符串,/* // 注释以后。

如果发现{, [, ( 那么入栈,发现 },],) 以后出栈,对比是否匹配。

文件检查完以后,堆栈内为空,说明匹配成功。

(ps一句,很多代码是抄的)


第二道题思路

首先把中缀式转换为后缀式。

转换过程

1)若读入的是操作数,入到输出栈

2)读入的是闭括号,把操作栈中的运算符依次出栈,推入输出栈,一直遇到对应开括号为止,把开括号出栈

3)读入的开括号,进运算符栈

4)读入的是运算符,如果运算符栈优先级高,堆栈运算符出栈,出栈操作一直要进行到栈顶运算符优先级低为止,然后把新的运算符入栈

5)在读入操作符结束扣,把运算符栈中所有剩余运算符依次出栈,放入输出栈

6)计算输出堆表达式的


直接发代码.

先发堆栈的。

#ifndef __ListDemo__List__
#define __ListDemo__List__

#include <iostream>

template <typename T>
class ListNode
{
public:
    T            element;
    ListNode<T>  *next;
public:
    ListNode(T te, ListNode<T> *L):element(te), next(L){}
    ListNode(T te):element(te), next(NULL){}
};

template <typename T>
class Stack {
private:
    ListNode<T>      *head;
public:
    const int isEmpty() const;
    
    void    push(T x);
    T       pop();
    T       top();
};


template <typename T>
const int Stack<T>::isEmpty() const
{
    return head == NULL;
}

template <typename T>
void Stack<T>::push(T x)
{
    if (head == NULL)
    {
        head = new ListNode<T>(x);
    }
    else
    {
        ListNode<T> *p = new ListNode<T>(x, head);
        
        head = p;
    }
}

template <typename T>
T Stack<T>::pop()
{
    if (head == NULL)
    {
//        return NULL;
    }
    ListNode<T> *p = head->next;
    T x = head->element;
    delete head;
    head = p;
    
    return x;
}

template <typename T>
T Stack<T>::top()
{
    if (head == NULL)
    {
        //        return NULL;
    }
    return head->element;
}

#endif /* defined(__ListDemo__List__) */

第一道题:

#ifndef ListDemo_CheckFlag_h
#define ListDemo_CheckFlag_h

#include <iostream>
#include "List.h"

struct Symbol {
    char    Token;
    int     Theline;
};

class CheckFlag
{
private:
    enum CommonentType { SlashSlash, SlashStar };   // // or /*
    istream &       InputStream;
    char            Ch;
    int             CurrentLine;
    Stack<Symbol>   PendingTokens;                  //没有处理的开括号
    int             Errors;
    
private:
    int NextChar();                                 //下1个字符
    void PutBackChar();                             //把当前字符放回输入流
    void SkipComment(CommonentType Start);          //跳过 // /*
    void SkipQuote(char QuoteType);                 //跳过 '' 和 ""
    char GetNextSymbol();                      
数据结构之——用C++实现算术表达式求值 基本功能:利用栈实现整数的加减乘除运算。 使用方法:输入表达式之后再输入#表示表达式结束,如下图: 缺点:不能进行小数的运算 代码如下: #include #include #include using namespace std; #define MAXNUM 50 class Stack_for_number { private: float num[M 阅读详情

相关推荐

中缀表达式求值

基本思路: 定义两个栈,分别用于存放运算数与运算符。 运算数 直接入 运算数栈 对于运算符op, 若运算符栈为空,直接入栈 若是左括号(,直接入栈 若栈顶运算符为左括号(,直接入栈 若op的优先级 高于 栈顶运算符,直接入栈 若op的优先级 低于或等于 栈顶运算符,则需要进行计算后再入栈 若是右括号),则需要进行计算,直到遇到(,此时(...)内的算式的结果被计算出,将(踢出 注意:(、)括号要单独考虑。 用到的一些技巧: 用unordered_map定义运算符的优先级,达到已知运算符即可得出其

Shao_yihao的博客 503

头歌--C++之整数计算基础

头歌--C++之整数计算基础

m0_56638814的博客 1360

TCNOpen实现TRDP通信协议(源码编译运行测试)

概述 本文介绍了通过TCNOpen开源源码实现TRDP通信,包括源码下载,开发环境搭建,编译运行,测试。 Linux环境下编译运行TRDP (一) 下载CANOpen源码。 下载地址:https://sourceforge.net/p/tcnopen/trdp/HEAD/tree/ (二) 源码编译 下载源码解压过后,在根目录文件readme-makefile.txt有介绍源码的配置和编译方法。 在trdp/config目录下可以看到包含在linux环境下的编译配置文件LINUX_config;执行”m

fengweibo112的博客 9630

RiscV运行zephyr和Linux的方法

riscv基金会搞了一个网站,用于介绍如何使用riscv指令集进行开发。 对于运行zephyr和linux以及Qemu有非常大的帮助。 可以作为riscv开发的相关参考。 RISC-V - Getting Started Guide — RISC-V - Getting Started Guidehttps://risc-v-getting-started-guide.readthedocs.io/en/latest/index.html RISC-V - Getting Started Gu.

闲人的专栏 736

29、几何形态测量学在蝴蝶翅膀研究中的应用

本博客介绍了几何形态测量学在花斑木蛱蝶(Pararge aegeria)翅膀研究中的应用,探讨了环境因素对蝴蝶翅膀大小和形状的影响。通过选择合适的地标并采用Procrustes分析方法,研究揭示了不同景观类型下翅膀形状的差异及其潜在的适应性意义。文章还讨论了发育可塑性在飞行形态变异中的作用,并比较了几何形态测量学与其他传统方法的优势。最后提出了未来研究方向,包括多因素综合分析、发育机制探索及长期生态监测,为理解蝴蝶的适应性进化提供了重要线索。

ff678的博客 107

【ComfyUI】SD1.5 + ControlNet 边缘检测融合动漫转真人

本文介绍了一个基于ComfyUI的动漫转真人图像生成工作流,通过多模型协同实现高质量的二次元图像转换。该工作流集成了Canny线稿预处理、ControlNet结构控制、VAE编码解码和人脸精细化处理等核心环节,采用majicmixRealistic_v7作为主模型,配合yolov8、SAM等辅助模型。整个流程包含11个标准化步骤,从图像输入、预处理到最终超分输出,通过ControlNet引导和CLIP语义控制确保生成图像的写实感和结构准确性,特别针对人脸区域进行专业优化,最终可输出高分辨率写实人像。

Mr数据杨 1121

【CAN总线测试】——使用VH6501 进行Busoff快慢恢复测试

即在IDBase中填标准帧11位二进制ID,如果不满11位,高位补零,凑齐11位,并将下方CurrTriggerField设置干扰前一位AckSlot位,Triggeroffset设置为0。首先确认环境支持VN6501,6501硬件连接成功后,工程的小闪电是正常黄色状态,若是灰色证明缺少License,或者软件安装环境不正确。填写干扰报文ID、干扰位置 注意这里的干扰位置是实际干扰的前一位,TriggerOffset表示偏移量,可以干扰某个字节的具体位.找到并打开Panel后,开启工程,并且配置面板。

LOVE135149的博客 5628

芯片测试:WAT、CP、FT

最近部门来了一个日本回来的同事,虽然他尽量用非常Poor的中文给我解释一些东西,其中还夹杂着一些英文让我很受挫,于是最近来学一下WAT中的常用的单词含义。直接去查缩写、查单词很难去记住,要把具体的东西放在具体的场景,引发知识的连接才会在脑子里留下一定的映像。感兴趣的一起来学习一下这篇不错的文章吧。注释是我查询记录,如有不妥,欢迎指出修正。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 5081

【VTK】VTK中的光标样式

本文分享VTK中的光标设置相关内容技术,希望对各位小伙伴有所帮助!

qq_40041064的博客 1928

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: Django中扩展User模型
下一篇: C++ 实现搜索子串KMP 算法
watsy
博客等级 码龄19年 133粉丝 104原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值