数据结构----利用栈实现表达式的计算

2023-10-26

利用栈实现表达式的计算:
例如:12×(5+6×9)+7×8+(5-6×8+5/6)×12
要解决的问题主要有两个:

  1. × , ÷ 和 + , - 的运算顺序的处理问题
  2. 括号内的表达式优先运算问题
    这里利用栈来解决这两个问题
    首先我们设置两个栈,一个符号栈,一个数字栈
    下面我们来模拟一下栈的操作过程:
    首先用char数组储存字符串,然后用for循环对字符串的每一个字符进行遍历
    1.如果遍历到数字则存入一个临时的栈(因为此时数字可能有多为需要进行一些转化 , 代码中会讲),
    2.如果是符号的话,则进入符号栈(这里对‘)’需要进行特殊处理,当遍历到‘)’时要将符号栈清空至‘(’即优先计算括号内的表达式
    3.处理加,减法时,由于栈结构是
    倒序
    ,所以只要将数字栈中的数字加或减入ans中( eg. 7*8 + 5 这里直接在ans中加5就不需要考虑,加与乘 的优先级的关系 )
    4.处理乘,除时,可以先计算结果,再将结果压入栈中
    下面是代码:
#include<bits/stdc++.h>
using namespace std;
stack<char>sml;  //储存符号的符号栈
stack<double>dgt;  //储存数字的数字栈
stack<double>tmp;   //临时栈,作用为将多个数字字符转换成数字
static double ans = 0.0;
void mixed()   //计算表达式的函数
{
    double t = 0;
    if(sml.top() == '-' || sml.top() == '+')  //如果栈顶为‘-’或者为‘+’,则将栈顶元素加入ans中
          {
              if(sml.top() == '-')ans -= dgt.top();
              else if(sml.top() == '+') ans += dgt.top();
              dgt.pop();  //将已经计算完的出栈
              sml.pop();
          }
          else if(sml.top() == '*' || sml.top() == '/')  //将*或/的结果入栈
          {
              double temp = dgt.top();
              dgt.pop();
              if(sml.top() == '*') t = dgt.top() * temp;
              else if(sml.top() == '/') t = dgt.top() / temp;
              dgt.pop();
              dgt.push(t);
              sml.pop();
          }
}
int getnum()  //转化多位数的函数
{
    int index = 0 , ans1 = 0;
    while(!tmp.empty())
    {
        int num = tmp.top();
        tmp.pop();
        ans1 += num * pow(10 , index++);
    }
    return ans1;
}
void cut()  //计算括号内表达式的值
{
    while(sml.top() != '(')
        mixed();
    sml.pop();
}
void getvalue(char *exp , int len)
{
    for(int i = 0 ; i < len ; i++)
    {
        if(isdigit(exp[i]))
        {
            double num = exp[i] - '0';
            tmp.push(num);
        }
        else
        {
            if(!tmp.empty())
            {
                double num = getnum();
                dgt.push(num);
            }
            if(exp[i] == '(')
                sml.push(exp[i]);
            else if(exp[i] == ')')
            {
                cut();
                ans += dgt.top();
                dgt.pop();
                dgt.push(ans);
                ans = 0;
            }
            else
                sml.push(exp[i]);
        }
    }
     if(!tmp.empty())
     {
        double num = getnum();
        dgt.push(num);
     }
    while(!sml.empty())
        mixed();
    cout<<dgt.top() + ans;  //自己模拟运算一下有助于理解
}
int main()
{
    char exp[100];
    cin>>exp;
    int len = strlen(exp);
    getvalue(exp , len);
    return 0;
}

运行结果:
在这里插入图片描述
二:将中缀表达式转化为后缀表达式(这里进行了升级,可以实现"^" 和 "%"的运算,并且可以读取小数点)
下面是代码:

#include<bits/stdc++.h>
using namespace std;
stack<char>tmp;   //储存后缀表达式的栈
stack<char>sml;   //储存符号的栈
stack<double>dgt;   //储存数的栈
stack<char>temp;   //转化栈, 将字符串转化为数值
double num[1000];
int cnt = 0;
bool flag = false;   //判断数中是否有小数点的标志
void getnum(bool &flag);   //将字符串转化为数值的函数
void change(char *exp);     //将中缀表达式转化为后缀表达式的函数
void getvalue();     //计算后缀表达式的函数
int getprior(char ch);   //获取符号优先级的函数;
void cal(double num1 , double num2 , char op);   //计算函数
int main()
{
    char exp[100];
    cin>>exp;
     change(exp);
    getvalue();
    return 0;   //12.2*(15.4+5*2^3)*12.3+4+5%6+10*12.2
}
int getprior(char ch)
{
    if(ch == '-' || ch == '+')
        return 2;
    else if(ch == '*' || ch == '/' || ch == '%')
        return 3;
    else if(ch == '^')
        return 4;
    else if(ch == '(')
        return 5;
    else if(ch == ')')
        return 1;
}
void getnum(bool &flag)
{
    double ans = 0;
    double t = 0;
    int counted = 0;   //计算小数点后有几位
    int index = 0;     //整数部分的下标
    while(!temp.empty())
    {
        if(flag)    //如果有小数点
        {
            while(temp.top() != '.')
            {
                int i = temp.top() - '0';
                t = t + i * pow(10 , counted);
                counted++;
                temp.pop();
            }
            temp.pop();   //将小数点出栈
            t = t * pow(10 , -counted);
            flag = false;   //小数点已出栈
        }
        int i = temp.top() - '0';
        ans = ans + i * pow(10 , index);
        index++;
        temp.pop();
    }
    ans += t;   //将小数部分和整数部分相加
    num[cnt] = ans;
}
void change(char *exp)
{
    int len = strlen(exp);
    for(int i = 0 ; i < len ; i++)
    {
        if(isdigit(exp[i]) || exp[i] == '.')
        {
            if(exp[i] == '.')
                flag = true;
            temp.push(exp[i]);
        }
        else
        {
            if(!temp.empty())
            {
                cnt++;
                getnum(flag);
                char t = '1';  //标记是数字
                tmp.push(t);
            }
                if(sml.empty() || exp[i] == '(')
                    sml.push(exp[i]);
                else
                {
                    if(exp[i] == ')')
                    {
                        while(sml.top() != '(')
                        {
                            char ch = sml.top();
                            tmp.push(ch);
                            sml.pop();
                        }
                        sml.pop();   //将'('出栈
                    }
                    else
                    {
                        char ch = sml.top();
                        while(getprior(ch) >= getprior(exp[i]) && ch != '(')  //如果栈顶符号的优先级大于这个符号,则压入后缀栈,等于因为在前面也压入后缀栈
                        {
                            tmp.push(ch);
                            sml.pop();
                            if(!sml.empty()) ch = sml.top();
                            else break;
                        }
                        sml.push(exp[i]);
                    }
                }
        }
    }
                if(!temp.empty())
                {
                    cnt++;
                    getnum(flag);
                    char t = '1';
                    tmp.push(t);
                }
                while(!sml.empty())
                {
                    char c = sml.top();
                    tmp.push(c);
                    sml.pop();
                }
}
void getvalue()
{
    stack<char>s;
    while(!tmp.empty())
    {
        char c = tmp.top();
        s.push(c);
        tmp.pop();
    }
    int index = 1;
    while(!s.empty())
    {
        char c = s.top();
        if(isdigit(c))
        {
            dgt.push(num[index]);
            index++;
            s.pop();
        }
        else
        {
            double num2 = dgt.top();
            dgt.pop();
            double num1 = dgt.top();  //取出数值栈中的值
            dgt.pop();
            cal(num1 , num2 , c);
            s.pop();   //将符号出栈
        }
    }
    cout<<dgt.top();
}
void cal(double num1 , double num2  , char op)
{
    switch (op)
    {
        case '+' : dgt.push(num1 + num2);break;
        case '-' : dgt.push(num1 - num2);break;
        case '*' : dgt.push(num1 * num2);break;
        case '/' : dgt.push(num1 / num2);break;
        case '%' : dgt.push( (int)num1 % (int)num2);break;
        case '^' : dgt.push(pow((int)num1 , (int)num2));break;
    }
} 

运行结果:
在这里插入图片描述
下面更新一个我自己手写的栈(数据结构老师要求我们不嫩用STL中的数据结构,不然鬼想写 这鬼东西QAQ)
文件名:“stack.h”
代码块:

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
#include<iostream>
using namespace std;
template<class Type>
class mystack
{
struct node
{
    Type data;
    node* next;
};
public:
    mystack()   //无参构造函数
    {
        top -> next = NULL;
        top -> data = 0;
    }
    bool empty()  //判断栈是否为空
    {
        return top -> next == NULL;
    }
    int getsize()  //获取栈的大小的函数
    {
        node* p = top;
        int counted = 0;
        while(p -> next != NULL)
        {
            counted++;
            p = p -> next;
        }
        return counted;
    }
    void push(Type elem)  //将元素压入栈中的函数
    {
        node *q = new node;
        q -> data = elem;
        q -> next = top -> next;
        top -> next = q;
    }
    void pop()  //将栈顶元素出栈的操作
    {
        node* q = top -> next;
        top -> next = top -> next -> next;
        delete q;
    }
    Type gettop()  //获取栈顶元素的函数
    {
        return top -> next -> data;
    }
private:
    node* top = new node;
};
#endif // STACK_H_INCLUDED

下面是修改后的cpp文件(就是用上我自己手写的破栈的文件)

#include<iostream>  //我自己调试了一下应该没什么问题
#include<cmath>
#include<cstring>
#include"stack.h"
using namespace std;
mystack<char>tmp;   //储存后缀表达式的栈
mystack<char>sml;   //储存符号的栈
mystack<double>dgt;   //储存数的栈
mystack<char>temp;   //转化栈, 将字符串转化为数值
double num[1000];
int cnt = 0;
bool flag = false;   //判断数中是否有小数点的标志
void getnum(bool &flag);   //将字符串转化为数值的函数
void change(char *exp);     //将中缀表达式转化为后缀表达式的函数
void getvalue();     //计算后缀表达式的函数
int getprior(char ch);   //获取符号优先级的函数;
void cal(double num1 , double num2 , char op);   //计算函数
int main()
{
    char exp[100];
    cin>>exp;
     change(exp);
    getvalue();
    return 0;   //12.2*(15.4+5*2^3)*12.3+4+5%6+10*12.2
}
int getprior(char ch)
{
    if(ch == '-' || ch == '+')
        return 2;
    else if(ch == '*' || ch == '/' || ch == '%')
        return 3;
    else if(ch == '^')
        return 4;
    else if(ch == '(')
        return 5;
    else if(ch == ')')
        return 1;
}
void getnum(bool &flag)
{
    double ans = 0;
    double t = 0;
    int counted = 0;   //计算小数点后有几位
    int index = 0;     //整数部分的下标
    while(!temp.empty())
    {
        if(flag)    //如果有小数点
        {
            while(temp.gettop() != '.')
            {
                int i = temp.gettop() - '0';
                t = t + i * pow(10 , counted);
                counted++;
                temp.pop();
            }
            temp.pop();   //将小数点出栈
            t = t * pow(10 , -counted);
            flag = false;   //小数点已出栈
        }
        int i = temp.gettop() - '0';
        ans = ans + i * pow(10 , index);
        index++;
        temp.pop();
    }
    ans += t;   //将小数部分和整数部分相加
    num[cnt] = ans;
}
void change(char *exp)
{
    int len = strlen(exp);
    for(int i = 0 ; i < len ; i++)
    {
        if(isdigit(exp[i]) || exp[i] == '.')
        {
            if(exp[i] == '.')
                flag = true;
            temp.push(exp[i]);
        }
        else
        {
            if(!temp.empty())
            {
                cnt++;
                getnum(flag);
                char t = '1';
                tmp.push(t);
            }
                if(sml.empty() || exp[i] == '(')
                    sml.push(exp[i]);
                else
                {
                    if(exp[i] == ')')
                    {
                        while(sml.gettop() != '(')
                        {
                            char ch = sml.gettop();
                            tmp.push(ch);
                            sml.pop();
                        }
                        sml.pop();   //将'('出栈
                    }
                    else
                    {
                        char ch = sml.gettop();
                        if(getprior(ch) >= getprior(exp[i]) && ch != '(')  //如果栈顶符号的优先级大于这个符号,则压入后缀栈
                        {
                            tmp.push(ch);
                            sml.pop();
                        }
                        sml.push(exp[i]);
                    }
                }
        }
    }
                if(!temp.empty())
                {
                    cnt++;
                    getnum(flag);
                    char t = '1';
                    tmp.push(t);
                }
                while(!sml.empty())
                {
                    char c = sml.gettop();
                    tmp.push(c);
                    sml.pop();
                }
}
void getvalue()
{
    mystack<char>s;
    while(!tmp.empty())
    {
        char c = tmp.gettop();
        s.push(c);
        tmp.pop();
    }
    int index = 1;
    while(!s.empty())
    {
        char c = s.gettop();
        if(isdigit(c))
        {
            dgt.push(num[index]);
            index++;
            s.pop();
        }
        else
        {
            double num2 = dgt.gettop();
            dgt.pop();
            double num1 = dgt.gettop();  //取出数值栈中的值
            dgt.pop();
            cal(num1 , num2 , c);
            s.pop();   //将符号出栈
        }
    }
    cout<<dgt.gettop();
}
void cal(double num1 , double num2  , char op)
{
    switch (op)
    {
        case '+' : dgt.push(num1 + num2);break;
        case '-' : dgt.push(num1 - num2);break;
        case '*' : dgt.push(num1 * num2);break;
        case '/' : dgt.push(num1 / num2);break;
        case '%' : dgt.push( (int)num1 % (int)num2);break;
        case '^' : dgt.push(pow((int)num1 , (int)num2));break;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构----利用栈实现表达式的计算 的相关文章

  • .NET C# - MigraDoc - 如何更改文档字符集?

    我已经寻找过这个问题的解决方案 但仍然找不到答案 任何帮助 将不胜感激 Document document new Document Section section document AddSection Paragraph paragra
  • Python 的局限性是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我花了几天时间阅读有关 C 和 Python 的内容 发现 Python 非常简单且易于学习 所以我想知道它真的值得花时间学习吗 或者我应该花时
  • 如何使用 Windows 粘贴命令将文本粘贴到 C# 中的其他应用程序?

    如何调用互操作来使用 Windows Pastse 命令将文本粘贴到 C 中的其他应用程序 调用互操作 我的意思是如何对 C 进行编程相同的右键单击粘贴文本 在某些情况下这可能有点棘手 但实际上非常简单且容易做到 下面的示例介绍了如何使用文
  • jni.h:没有这样的文件或目录

    我一直在关注本教程 http www java tips org other api tips jni simple example of using the java native interface html 在第 5 步 我从 GCC
  • Polly 策略记录异常并重新抛出

    我考虑使用Polly https github com App vNext Polly handing return values and policytresult创建策略来记录异常并重新抛出 我没有找到允许它开箱即用的现有方法 但我看到
  • 调用程序中对库类成员的未定义引用错误

    下面添加了其他问题 2011 年 4 月 11 日 我正在用 C 开发一组跨平台的共享库 DLL Sos 和测试程序 尽管我必须能够支持 C 这些库将仅作为目标代码发布 但测试程序将随源代码一起发布 因此我们的客户可以获得示例代码 因此 我
  • 在 Silverlight 中编辑并继续?

    Edit And Continue 是我最喜欢的调试工具之一 我之前曾在基于 C 的 Winforms 和 ASP NET 项目中使用过它 但是 我在 VS 2008 上运行 Silverlight 3 0 应用程序 每当我尝试进行更改 中
  • std::ostream 需要功能帮助

    我需要有人逐步向我解释这些代码行 并且我需要一些帮助来使用 ostream 和简单的示例 谢谢 inline std ostream operator lt lt std ostream os const Telegram t os lt
  • 无法打开作为链接添加的 configSource 文件

    在我的 MVC 应用程序中 我使用外部配置文件来保持干净的 web config 有些文件很常见 我将它们作为链接从一个位置添加到项目中 对于这些文件 我将 复制 选项设置为 始终复制 这些文件将被复制到目标文件夹 我会看到它们 但是当我尝
  • 为了安全起见,在注销时禁用浏览器的后退按钮,例如 Yahoo、Gmail 等

    首先 我在 global asax 文件中将会话变量设置为 Session SessionId 如下所示 void Session Start object sender EventArgs e Code that runs when a
  • 为什么无法在 android 中包含 iostream?

    已安装 android ndk r7 并尝试编译 cpp 文件 include
  • Haskell FFI - 你能从 Haskell 数据结构中获取 C 指针吗?

    我有很多 C 结构体 结构如下 typedef struct unsigned int a unsigned int b StructA 还有很多功能 比如 void doSomethingWith StructA StructB Stru
  • 推导具有两个以上参数的 std::function

    我想知道为什么std function http en cppreference com w cpp utility functional function只知道有两个参数的函数 我已经编写了一些运行良好的代码 但存在许多限制 欢迎任何反馈
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • Excel 中的单元格“数字存储为文本”

    我有一个 C 程序 它获取旧报告的文本文件并映射到 Excel 工作表 但对于交易单元格 它输出为 数字存储为文本 这不允许 任何格式 我们想要显示 1 000 00 但它仅显示为 1000 有什么办法可以得到这种格式吗 这些列是余额和金额
  • 为什么我的 QGestureRecognizer 收不到触摸事件?

    上下文 我正在尝试创建一个类似推子的小部件 它可以在同一视图中具有多个实例 每个实例都可以由不同的手指同时控制 我想用Qt的手势识别系统 http qt project org doc qt 4 8 gestures overview ht
  • 有条件地使用按位运算符

    条件运算符如何使用按位运算符表示 这是一个家庭作业问题 我必须仅使用按位运算来实现条件运算符 那就很简单了 如果if允许使用语句 但它必须是严格的按位运算符 仅运营商 gt gt and lt lt 可以使用 不if可以使用语句或循环 该函
  • __get_cpuid 的可移植性如何?

    我在用着 get cpuid 获取有关的信息x86 and x86 64我的程序运行的处理器 在 Linux 和 Mac OS 上使用 GCC 似乎可以在不包含任何头文件的情况下编译和运行 但是它的可移植性如何 它可以与其他编译器一起使用吗
  • 无法使用 openxml 在 PPT 报告中生成第二个表

    我有这个代码 我能够完美地生成带有文本数据的 pptx 报告 我在这份报告中还有 4 个表格 其中包含动态数据 我可以在 PPT 中生成一张表格 但无法生成多个表格 Requirement On the right I have 4 tab
  • EF,Code First - 如何在插入时设置自定义 Guid 标识值

    在处理在数据库中插入新实体时 我面临以下问题Guid作为主键 代码优先的 EF 5方法 我知道有很多类似的主题 因为我为此问题运行了几个小时 但我找不到与此问题相关的主题 举个例子 我的 POCO 类是 public class Entit

随机推荐

  • 【直达本质讲运放】运放的“第一原理”式定量分析法

    数电 模电那两本书我也完整地翻过一 二遍 诶我为什么用 也 下面就是来点不复杂的 如果是那还不如直接把书的内容粘过来呢 对于运放的定量分析 虚短虚断 就如同 奇变偶不变 一样喜闻乐见的普及 但是对于什么时候用 虚短 什么时候用 虚断 学习的
  • Ridge和Lasso回归

    上周看了看回归方面的知识 顺便复 xue 习一下Ridge 岭回归 和Lasso回归 套索回归 瞅到了一篇英文博客讲得不错 翻译一下 本文翻译自 Ridge and Lasso Regression 本文是一篇Josh Starmer关于
  • 常用网络协议神图

  • 凸优化(一)——Introduction

    Introduction 一 最优化问题的数学表达 在最优问题中 其数学表达往往能化成标准形式 如下 minimizef0 x subject tofi x bi i 1 m begin aligned minimize quad f 0
  • 微信小程序对上传的图片进行裁剪

    背景 使用uniapp中uni chooseImage的裁剪参数crop只能在App中生效 在微信小程序中不生效 实现思路 uni chooseImage打开相册获取图片路径 uni chooseImage OBJECT uni app官网
  • c++面试记录

    1 数组与指针区别 数组 数组是用于储存多个相同类型数据的集合 指针 指针是一个变量 但是它和普通变量不一样 它存放的是其它变量在内存中的地址 赋值 数组 只能一个一个元素的赋值或拷贝 指针 指针变量可以相互赋值 表示范围 数组有效范围就是
  • flink table 使用Kafka Connector处理嵌套json

    使用flink table api 连接kafka 处理json类型数据 单层json处理比较简单 官方或网上都有很多例子 处理嵌套的json数据没什么介绍 处理嵌套json数据主要是schema定义 StreamExecutionEnvi
  • Linux系统之使用yum安装Redis数据库

    Linux系统之使用yum安装Redis数据库 一 redis介绍 1 redis解释 2 redis特点 3 redis使用场景 二 检查系统版本 1 检查系统版本 2 检查内核版本 三 检查yum仓库状态 四 查看系统默认提供的redi
  • mysql数据恢复,使用binlog配置恢复未备份数据

    使用mysqlbinlog配置 恢复数据库 什么是mysqlbinlog binlog是记录所有数据库表结构变更 例如CREATE ALTER TABLE 以及表数据修改 INSERT UPDATE DELETE 的二进制日志 binlog
  • 命令行参数设计

    1 目的 众多通用的小功能 制作为一个小工具 然后通过命令行来进行交互 使用非常的简便 本规范是为了统一命令行参数的设计 使得大家在制作或使用命令行工具时 能够更加有共享 进行会更加方便 2 适用范围 所有命令行工具参数的设计 3 基本原则
  • #SATA# SATA 实际管脚接线图

    前言 概述 实际接线管脚图 PATA 接口 M 2 U 2 AHCI NVMe 概述 SATA是Serial ATA的缩写 即串行ATA 它是一种电脑总线 主要功能是用作主板和大量存储设备 如硬盘及光盘驱动器 之间的数据传输 这是一种完全不
  • 迁移学习:他山之石,可以攻玉【VALSE Webinar】Panel实录

    编者按 迁移学习是机器学习与计算机视觉中的重要研究问题之一 旨在研究如何将一个领域的知识迁移到另外的领域 具有重要的研究意义与应用价值 但迁移学习又会存在哪些局限性 在实际应用中的价值是什么 未来的发展方向在哪里 为此 VALSE Webi
  • docker 数据持久化

    文章目录 定制镜像持久化 需求 实现 数据卷持久化 数据卷简介 数据卷的特性 创建读写数据卷 停止容器后的操作 查看数据卷详情 创建只写数据卷 查看数据卷详情 创建共享数据卷 Dockerfile持久化 创建Dockerfile 构建和运行
  • 大二上学期数据结构课程设计

    1 报数问题 问题描述 有n个小朋友围成一圈玩游戏 小朋友从1至n编号 2号小朋友坐在1号小朋友的顺时针方向 3号小朋友坐在2号小朋友的顺时针方向 1号小朋友坐在n号小朋友的顺时针方向 游戏开始 从1号小朋友开始顺时针报数 接下来每个小朋友
  • 安装TensorFlow遇到no module named ‘tensorflow’问题解决方法

    按照这个博客https blog csdn net qq 16633405 article details 79941696里的步骤安装TensorFlow时遇到no module named tensorflow 虽然作者给出了一个解决方
  • 文本多分类之Doc2Vec实战篇

    本文链接 https blog csdn net weixin 42608414 article details 88391760 版权 在我之前的几篇博客中 我介绍了两种文档向量化的表示方法 如Sklearn的CountVectorize
  • 1.3. 分治法—最近点对问题

    1 问题描述 给定平面S上n个点 找其中的一对点 使得在n个点组成的所有点对中 该点对间的距离最小 2 求解过程 划分 将集合S分成两个大小基本相等的子集 S 1 S 1 S1 和 S
  • linux 基础知识考试试题,Linux常识型试题

    Linux常识型试题 发布时间 2011 06 06 18 11 10来源 红联作者 lijiang i s 本帖最后由 lijiang 于 2011 10 22 17 51 编辑 i 一 填空题 1 链接分为 和 2 安装Linux系统对
  • 解决Linux界面显示问号字符?与Failed to set locale, defaulting to C报错

    解决方法 暂时性处理 export LC ALL zh CN UTF 8 一劳永逸 vim etc bashrc 然后在最后一行写入 export LC ALL zh CN UTF 8 问题复现 解析 当输入 locale 会得到如下结果
  • 数据结构----利用栈实现表达式的计算

    利用栈实现表达式的计算 例如 12 5 6 9 7 8 5 6 8 5 6 12 要解决的问题主要有两个 和 的运算顺序的处理问题 括号内的表达式优先运算问题 这里利用栈来解决这两个问题 首先我们设置两个栈 一个符号栈 一个数字栈 下面我们