【c++】用栈实现四则运算

问题分析

Exp = a * b + c - d / f

  • 确定计算规则,即明确运算符的优先级
  • 确定当前处理字符是运算符还是操作数
  • 每个运算符的运算次序要由它之后的一个运算符来定

算法思路

Exp = # a * b + c - d / f #

  1. 设立操作数栈操作符栈
  2. 设表达式的结束符为“#”,预设运算符栈的栈底为“#”
  3. 若当前字符是操作数,则直接压入操作数栈
  4. 若当前字符是操作符,则与操作符栈的栈顶运算符进行优先级比较
    • 若优先级高于栈顶运算符则进栈
    • 若优先级低于栈顶运算符则从操作数栈中弹出两个操作数a,b,从操作符栈中弹出一个运算符Ω,经计算后将结果T压入操作数栈

图解

请添加图片描述

代码实现

#include <iostream>
using namespace std;
char operation[1000];
    
int Calculate (int a, char b, int c) {
    if (b == '+') {
        return a + c;
    } else if (b == '-') {
        return a - c;
    } else if (b == '*') {
        return a * c;
    } else if (b == '/') {
        return a / c;
    }
    return 0;
}
    
int Compare (char a) {
    if (a == '+' || a == '-') {
        return 1;
    } else if (a == '*' || a == '/') {
        return 2;
    } else if (a == '#') {
        return 0;
    } else cout << "格式错误";
    return 0;
}
    
int main(int argc, const char * argv[]) {
    
    int numberStack[100] = {0};
    int numberTop = -1;
        
    char symbolStack[100] = {'#'};
    int symbolTop = -1;
        
    int tempNumber = 0;
    bool judge = false;
        
    cin >> operation;
        
    for (int i = 0; i < strlen(operation); i++) {
        if (operation[i] >= '0' && operation[i] <= '9') {
            tempNumber = tempNumber * 10 + operation[i] - '0';
            judge = false;
        } else {
            if (judge == false) {
                numberStack[++numberTop] = tempNumber;
                tempNumber = 0;
                judge = true;
            }
            if (symbolTop == -1) {
                symbolStack[++symbolTop] = operation[i];
            } else if (Compare(symbolStack[symbolTop]) < Compare(operation[i])) {
                symbolStack[++symbolTop] = operation[i];
            } else {
                int a = numberStack[numberTop--];
                char b = symbolStack[symbolTop--];
                int c = numberStack[numberTop--];
                tempNumber = Calculate (a, b, c);
                numberStack[++numberTop] = tempNumber;
                if (operation[i] == '#') {
                    cout << numberStack[numberTop] << endl;
                    break;
                }
                tempNumber = 0;
                i--;
            }
        }
    }
}

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值