编译原理实现计算器

该博客介绍了如何实现一个计算器,包括中缀表达式转后缀表达式、对字符串的解析以及文件读取处理。计算器支持四则运算、括号、变量赋值和print语句,使用C/C++或Java编写,不依赖第三方库,同时处理了除零等特殊情况。
摘要由CSDN通过智能技术生成

要求

计算器接受四则运算表达式为输入(如下所示)。如果表达式语法正确,则输出计算结果,否则报错,指出错误位置及原因。

1) 每个语句需要以“;”结束;

2) 涉及的操作符只要求加减乘除;支持括号;

3) 操作数为整数浮点数

4) 变量不需要先声明,可直接赋值,它的类型由右边表达式的类型决定;每个变量在使用之前必须要已经有赋值;

5) 变量名可以是由数字和字母组成,但首字符必须是字母; 

6) 输出语句使用print()函数,输出并换行;

7) print()函数不仅可以输出变量,还可以直接输出表达式的值,例如print(1+2)

8) 使用C/C++、Java编写,除了标准库外,不得使用任何第三方库。

9) 尽量考虑周全,顾及corner cases。例如除零;

 

思路说明

一、中缀表达式求值

1、创建“MyStack.h”文件,构建了栈的结构。

#pragma once
#include <iostream>
#define MAX 100
 using namespace std;
 template <class T>
 class MyStack
 {
     public:
             T data[MAX];
             int top;
        
     public:
             void init();        // 初始化栈
             bool empty();       // 判断栈是否为空
             T getTop();         // 读取栈顶元素(不出栈)
             void push(T x);     // 进栈
             T pop();            // 出栈
  };

 template<class T> 
 void MyStack<T>::init()
 {
         this->top = 0;
 }

 template<class T> 
 bool MyStack<T>::empty()
 {
         return this->top == 0 ? true : false;
 }

 template<class T>
 T MyStack<T>::getTop()
 {
     if (empty())
         {
             cout << "栈为空!\n";
             exit(1);
         }
     return this->data[this->top - 1];
  }

 template<class T> 
 void MyStack<T>::push(T x)
 {
     if (this->top == MAX)
         {
              cout << "栈已满!\n";
              exit(1);
          }
      this->data[this->top] = x;
      this->top++;
 }

 template<class T> 
 T MyStack<T>::pop()
 {

     if (this->empty())
         {
             cout << "栈为空! \n";
             exit(1);
         }
    
      T e = this->data[this->top - 1];
      this->top--;
     return e;
 }

 

2、创建了“InfixToPostfix.h”文件。里面有五个函数,共同完成对中缀表达式的求值

 

bool isoperator(char op);                                       // 判断是否为运算符

int priority(char op);                                          // 求运算符优先级

double postfix(string pre, map<string, int> mymap, int *i);     // 把中缀表达式转换为后缀表达式

  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值