通过入栈出栈实现数学表达式的计算

原创 2016年02月25日 09:30:32
#include <iostream>
#include <stack>
#include <string>
#include <cstring>
using namespace std;

class Exp {
    stack<char> ops; // 运算符栈
    stack<double> ds; // 数据栈
    double v, lh, rh; // 计算结果和临时变量
    char op; // 读取运算符
public:
    double calinput() { //读取并计算表达式,直到结束为止
        do {
            readdata(); //读取数据
            skipspace(); //跳过空白
        } while (readop()); //读取运算符
        calremain(); //处理栈中剩余的运算符
        return v;
    }
    //读取数据
    void readdata() {
        while (!(cin >> v)) { //读取数据失败,应该是左括号
            cin.clear();
            cin >> op; //读取必须是左括号
            if (op != '(') {
                throw string("在该出现数值的地方遇到了") + op;
            }
            ops.push(op);
        }
        ds.push(v);
    }
    //跳过空格
    void skipspace() {
        //cin.peek()查看不取走
        while (cin.peek() == ' ' || cin.peek() == '\t') {
            cin.ignore();
        }
    }
    //读取运算符,可能遇到右括号')'或者换行符'\n'
    bool readop() {
        while ((op = cin.get()) == ')') {
            while (ops.top() != '(') { //找栈里左括号'('
                rh = ds.top(); //从栈中取出右操作数
                ds.pop();
                lh = ds.top(); //从栈中取出左操作数
                ds.pop();
                ds.push(cal(lh, ops.top(), rh)); //取出运算符,计算左右操作数
                ops.pop();
            }
            ops.pop(); //丢弃找到的左括号'('
        }
        if (op == '\n') {
            return false;
        }
        if (strchr("+-*/", op) == NULL) { //无效运算符
            throw string("无效运算符") + op;
        }
        while (!ops.empty() && ops.top() != '(' && !prior(op, ops.top())) {
            rh = ds.top();
            ds.pop();
            lh = ds.top();
            ds.pop();
            ds.push(cal(lh, ops.top(), rh));
            ops.pop();
        }
        ops.push(op);
        return true;
    }
    void calremain() {
        while (!ops.empty()) {
            rh = ds.top();
            ds.pop();
            lh = ds.top();
            ds.pop();
            ds.push(cal(lh, ops.top(), rh));
            ops.pop();
        }
        if (ds.size() != 1) {
            throw string("无效的表达式");
        }
        v = ds.top();
        ds.pop();
    }
    double cal(double lh, char op, double rh) {
        return op == '+' ? lh + rh : op == '-' ? lh - rh :
                op == '*' ? lh * rh : lh / rh;
    }
    bool prior(char o1, char o2) {
        return (o1 != '+' && o1 != '-' && o2 != '*' && o2 != '/');
    }
};

int main(int argc, char** argv) {
    Exp e;
    try {
        cout << e.calinput() << endl;
    } catch (const string& e) {
        cout << e << endl;
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

堆栈的应用之计算数学表达式

下面的代码主要实现了以下功能: 输入数学表达式,输出表达式的计算结果。数学表达式由单个数字和运算符“+”、“-”、“”、“/”、“(、“)构成,例如 2 + 3 ( 4 + 5 ) – 6 / 4...
  • liyongqi_
  • liyongqi_
  • 2017年04月22日 17:52
  • 559

数据结构实验-堆栈的应用(数字表达式计算和迷宫)

  • 2012年12月17日 16:24
  • 4.33MB
  • 下载

输入数学表达式并计算出结果(包括小数)

输入数学表达式并计算出结果(包括小数) 萨达斯 要求如下: /**  * 输入一个数学计算表达式,如:1+2  * 然后输出计算后的结果:1+2=3  * 这里计算表达式只计算一次即可,可以使用加减...
  • wangqing84411433
  • wangqing84411433
  • 2016年12月11日 17:13
  • 1112

堆栈的应用之计算数学表达式

下面的代码主要实现了以下功能: 输入数学表达式,输出表达式的计算结果。数学表达式由单个数字和运算符“+”、“-”、“”、“/”、“(、“)构成,例如 2 + 3 ( 4 + 5 ) – 6 / 4...
  • liyongqi_
  • liyongqi_
  • 2017年04月22日 17:52
  • 559

输入数学表达式并计算出结果(包括小数)

输入数学表达式并计算出结果(包括小数) 萨达斯 要求如下: /**  * 输入一个数学计算表达式,如:1+2  * 然后输出计算后的结果:1+2=3  * 这里计算表达式只计算一次即可,可以使用加减...
  • wangqing84411433
  • wangqing84411433
  • 2016年12月11日 17:13
  • 1112

C++_利用栈进行运算符表达式的运算

一、基本思路: 将输入的表达式转化成后缀表达式,然后对后缀表达式进行运算二、将算式转化为后缀表达式: 1、从左向右读取输入的运算符 2、若为数字将数字写入字符串A中 3、若为运算符,与栈顶的运...
  • a7055117a
  • a7055117a
  • 2015年06月25日 18:36
  • 2412

给定任意的一个含数学运算符的字符串,求这个字符串转换成数学表达式的值。

问题:给出一个表达式,其内包含(、)、+、-、*、/、%等运算符,要求写出程序,计算出表达式的值。  其实,这个问题主要就是练习程序员对“栈”的使用。只要理解了原理,代码还是很好写的。  背景:  ...
  • pingyan158
  • pingyan158
  • 2013年12月05日 17:03
  • 6553

C++实现对数学基本运算表达式的解析

前段时间在LeetCode上刷题,遇到了很多涉及对字符串进行解析的题目。可能是出于这个原因,最近迷恋上了字符串的解析问题。数学基本运算表达式的解析就涉及这类问题。所谓数学基本运算表达式的解析就是指给定...
  • yorhomwang
  • yorhomwang
  • 2017年08月04日 18:22
  • 1322

利用栈和队列计算带有括号的表达式(纯理论)

可以使用将中缀表达式转为后缀的方法。 在这里我以一个例子来说明:先将9+(3-1)*3+10/2转为后缀表达式9 3 1 - 3 * + 10 2 / +,再通过计算后缀表达式得到20这个结果。在这...
  • java_xiaoer
  • java_xiaoer
  • 2016年01月04日 11:26
  • 475

C++用栈计算表达式

用STL中的栈作为工具,实现表达式的计算
  • yj3254
  • yj3254
  • 2015年02月10日 17:30
  • 828
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过入栈出栈实现数学表达式的计算
举报原因:
原因补充:

(最多只允许输入30个字)