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

原创 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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17416741/article/details/50735205

8.栈的应用-四则运算算术表达式求解(后序表达式法)

1.理论 在上节中看到使用“算符优先法”首先要自己去推导整个算符优先级表,然后计算机按照算符优先级表来出栈和进栈直到完成整个运算。这里推导算符优先级表是一个关键,但是这样比较繁琐,有没有更为直观的算...
  • wenzhou1219
  • wenzhou1219
  • 2014-04-19 10:31:44
  • 5446

栈实现后缀表达式的计算

#include /* 栈实现后缀表达式的计算,因为是后缀表达式计算所以只要定义一个OPND操作数栈,遇到运算符直接取前两个操作数运算后并压入栈即可*/#include #include #defin...
  • wufan1989620
  • wufan1989620
  • 2010-04-06 13:15:00
  • 411

栈实现表达式的计算

之前写过这个的博客,但是觉得不太好,都是截屏,所以我就趁有时间整理了一下。(结果发现了一个天大的低级错误。) 我在实现栈的时候把析构函数写错了()所以就出现了以下的错误: 首先,运行的时候答案是对...
  • weixin_35909255
  • weixin_35909255
  • 2017-02-12 14:42:43
  • 143

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

#include #include #include #include using namespace std;class Exp { stack ops; // 运算符栈 s...
  • qq_17416741
  • qq_17416741
  • 2016-02-25 09:30:32
  • 344

java实现数学表达式的运算(Stack)

package demo; import java.util.*;/** * Created by chenjiabing on 17-5-13. *//**主要的思想如下: * 程序从左到右的...
  • qq_34162294
  • qq_34162294
  • 2017-05-17 23:11:35
  • 2219

Java栈实现括号匹配、中序转后序表达式、中序表达式直接计算

数据结构复习,代码是最好的说明。 栈可以用数组实现,也可以用单链表实现,毕竟简单,基本操作自查API。 括号匹配: public class ParenthesisMatching { p...
  • poyuan97
  • poyuan97
  • 2017-09-25 15:49:56
  • 82

算术表达式的计算(栈的应用)

受大一学妹沈灵邀请,编了一个计算算术表达式的程序,主要运用栈来实现,具体思想参照,《数据结构》胡学刚,张晶主编第2章栈的应用 首先,我们建立两个栈,一个用来保存数字,一个用来保存字符。对于输入的字符...
  • Jaster_wisdom
  • Jaster_wisdom
  • 2016-05-29 16:51:30
  • 898

栈---定义、应用(递归、后缀表达式实现数学表达式求值)

一、定义栈是限定仅在表尾进行插入和删除操作的线性表。因此,栈的表尾端称为栈顶;表头端称为栈底。不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIF0...
  • will130
  • will130
  • 2015-10-23 17:22:35
  • 1924

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

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

栈-运算后缀表达式

package c_stack.D_postfix; public class ParsePost { private StackX theStackX; private String ...
  • Nuan_Feng
  • Nuan_Feng
  • 2017-02-23 12:05:03
  • 77
收藏助手
不良信息举报
您举报文章:通过入栈出栈实现数学表达式的计算
举报原因:
原因补充:

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