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;
}
相关推荐
xiaoye-duck2 天前
《算法题讲解指南:优选算法-栈》--65.删除字符中的所有相邻重复项,66.比较含退格的字符串,67.基本计算器II,68.字符串解码,69.验证栈序列
c++·算法·
圣光SG4 天前
数据结构通用笔记(语言无关)
数据结构·学习·链表·数组··队列
披着羊皮不是狼6 天前
深度解构栈内存的物理逻辑与系统保护
数据结构··底层原理
iFlyCai7 天前
栈的概念和用法
·数据结构与算法
Q741_1479 天前
每日一题 力扣 2751.机器人碰撞 映射 模拟 栈 C++ 题解
算法·leetcode·模拟··映射
Book思议-10 天前
【数据结构】栈与队列全方位对比 + C 语言完整实现
c语言·数据结构·算法··队列
Book思议-10 天前
【数据结构实战】栈的经典应用:后缀表达式求值 +中缀转后缀 ,原理 + 代码双通透
数据结构·算法··后缀表达式·后缀转中缀
Q741_14714 天前
每日一题 力扣 2946. 循环移位后的矩阵相似检查 力扣 155. 最小栈 数学 数组 模拟 C++ 题解
c++·算法·leetcode·矩阵·模拟·数组·
Book思议-15 天前
【数据结构实战】C语言实现栈的链式存储:从初始化到销毁,手把手教你写可运行代码
数据结构·算法·链表··408
Book思议-15 天前
【数据结构实战】川剧 “扯脸” 与栈的 LIFO 特性 :用 C 语言实现 3 种栈结构
c语言·数据结构·算法·