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

本文介绍如何使用C++实现算数表达式的求值。通过将中缀表达式转换为后缀表达式,然后利用堆栈来计算得出结果。首先跳过空格和注释,对括号进行匹配验证,接着按照特定规则将中缀表达式转换,最后通过运算符优先级判断计算后缀表达式。
摘要由CSDN通过智能技术生成

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

看到堆栈部分。有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();     
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值