SJUKY111 计算表达式

SJUKY111 计算表达式

⭐️难度:中等(其实很难)

⭐️类型:栈

📖题目:题目链接

🌟思路:

⭕️要把字符转换成浮点数,而不是整数,因为除法可能会产生小数

1️⃣需要两个栈:

1、操作数栈

2、符号栈

2️⃣符号栈规则:

1、栈空,直接进栈

2、进栈元素大于 栈顶元素,压栈,

3、进栈元素小于或等于栈顶元素,出栈

记忆:

老大来了,鸠占鹊巢

小弟来了,掩护被关的同伴和老大先走

3️⃣

符号栈出栈运算需要 循环 执行,因为要:

①循环弹出大或等于 进栈元素的运算符,如:栈:- 、 *+

②输入结束后依次弹出栈顶元素,如:栈:- 、 *\0

📚题解:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<vector>  // vector不需要.h
#include<list>
#include<set>  // // 可以用 set 和 multiset
#include<unordered_set> // 可以用 unordered_set 和 unordered_multiset
#include<map>  // 可以用 map 和 multimap
#include<unordered_map> // 可以用 unordered_map 和 unordered_multimap
#include<algorithm>
#include<string>
#include<iostream>
#include<queue>
#include<stack>

using namespace std;

int main() {

    // 用一个map保存各符号优先级
    map<char, int> youxianji = {
        {'\0',1},
        {'+',2},{'-',2},
        {'/',3},{'*',3}
    };
    
    char a[1000] = { 0 };
    while (scanf("%s", a) != EOF) {
        string numstr = "";  // 用一个字符串存数字
        stack<double> nums;  // 存操作数
        stack<char> fuhaos;  // 存操作符

        for (int i = 0;;i++) {  // 不在这里写退出条件,因为就算输入结束,也要将符号栈执行完
            if (a[i] >= '0' && a[i] <= '9') {
                numstr.push_back(a[i]);  
            }
            else {
                double num = stod(numstr);  // 将字符串转成double型
                nums.push(num);  
                numstr = "";  // 易漏:刷新numstr

                //fuhaos.push(a[i]); // 操作符先不急着进栈,要先判断栈内情况

                // 循环出栈
                // 出栈的情况:栈不为空 且 进栈元素优先级小于或等于栈顶元素
                while (!fuhaos.empty() &&
                    youxianji[a[i]] <= youxianji[fuhaos.top()]) {
                    
                    double rhs = nums.top();  // 先弹出是右操作数
                    nums.pop();
                    double lhs = nums.top();
                    nums.pop();
                    char fuhao = fuhaos.top();
                    fuhaos.pop();

                    if (fuhao == '+') {
                        nums.push(lhs + rhs);
                    }
                    else if (fuhao == '-') {
                        nums.push(lhs - rhs);
                    }
                    else if (fuhao == '*') {
                        nums.push(lhs * rhs);
                    }
                    else if (fuhao == '/') {
                        nums.push(lhs / rhs);
                    }
                }

                // 如果输入结束,输出结果
                if (a[i] == '\0') {
                    printf("%d\n",(int)nums.top()); // 结果保留整数,先强转成int
                    break;
                }
                // 如果栈空了 或 栈进栈元素优先级大于栈顶元素,直接进栈
                if (fuhaos.empty() || youxianji[a[i]] > youxianji[fuhaos.top()]) {
                    fuhaos.push(a[i]);
                }
            }
        }
    }

    return 0;
}
相关推荐
_小草鱼_9 天前
【数据结构】栈和队列
数据结构·数组··队列
qeen8713 天前
【数据结构】栈及其C语言模拟实现
c语言·数据结构·学习·
旖-旎13 天前
栈(验证栈序列)(5)
c++·算法·leetcode·力扣·
郝学胜-神的一滴20 天前
二叉树后序遍历:从递归到非递归的优雅实现
数据结构·c++·程序人生·算法·
xiaoye-duck22 天前
《算法题讲解指南:优选算法-栈》--65.删除字符中的所有相邻重复项,66.比较含退格的字符串,67.基本计算器II,68.字符串解码,69.验证栈序列
c++·算法·
圣光SG24 天前
数据结构通用笔记(语言无关)
数据结构·学习·链表·数组··队列
披着羊皮不是狼1 个月前
深度解构栈内存的物理逻辑与系统保护
数据结构··底层原理
iFlyCai1 个月前
栈的概念和用法
·数据结构与算法
Q741_1471 个月前
每日一题 力扣 2751.机器人碰撞 映射 模拟 栈 C++ 题解
算法·leetcode·模拟··映射
Book思议-1 个月前
【数据结构】栈与队列全方位对比 + C 语言完整实现
c语言·数据结构·算法··队列