闪亮的马路 发表于 2023-1-17 18:42:34

c++中字符转换问题

//文件名:test.cpp
#include <iostream>
#include <cmath>                                          // For pow() function
#include <iostream>                                       // For standard streams
#include <stack>                                          // For stack<T> container
#include <queue>
#include <algorithm>                                    // For remove()
#include <stdexcept>                                    // For runtime_error exception
#include <string>

int main ()
{
    std::string s("9+(3-1)*3+10/2");
    std::stack<std::string> z;
    std::queue<std::string> d;
    int cur(0);
    //逆波兰
    for(auto c:s)
    {
      if(c>='0' && c<='9')
      {
            cur = cur*10 + c-'0';
      }
      else
      {
            d.push(std::to_string(cur));
            cur = 0;
            if((c=='(')||(c=='+')||(c=='-'))
            {
                z.push(std::to_string(c));
            }
            else if((c=='*')||(c=='/'))
            {
                while((z.top()=="+")||(z.top()=="-"))
                {
                  d.push(z.top());
                  z.pop();
                }
            }
            else if (c==')')
            {
                while(z.top()!="(")
                {
                  //std::cout << z.top()<< std::endl;
                  d.push(z.top());
                  z.pop();
                };
                z.pop();
            }
      }
   
    }
   
    //根据逆波兰表达式求值
    std::stack<int> nums;
    while(!d.empty())
    {
      std::string cur_s = d.front();
      if(cur_s>='0'||cur_s<='9')
      {
            int cur_num(0);
            for(int i=cur_s.size()-1;i>=0;i--)
            {
                cur_num = cur_num*10 + cur_s;
            }
            nums.push(cur_num);
            d.pop();
      }
      else
      {
            int num1(0);
            int num2(0);
            int num3(0);
            num1 = nums.top();
            nums.pop();
            num2 = nums.top();
            nums.pop();
            if(cur_s=="+") num3 = num2+num1;
            else if(cur_s=="-") num3 = num2-num1;
            else if(cur_s=="*") num3 = num2*num1;
            else num3 = num2/num1;
            nums.push(num3);
      }
    }
    return nums.top();
   
}

以上的代码中,其中下面这段的打印输出,应该是()+-*这样的符号才对啊,但是打印输出的是其符号的ASCII的数值,这样一执行,这个while就跑飞了,哪个大神给解释下呢?
               while(z.top()!="(")
                {
                  //std::cout << z.top()<< std::endl;
                  d.push(z.top());
                  z.pop();
                };

ExiaGN001 发表于 2023-1-17 18:45:44

本帖最后由 ExiaGN001 于 2023-1-17 19:01 编辑

1.因为string to_string(char)不存在 且char能转换成int
所以 z.push(std::to_string(c)) 执行时,to_string实际调用的是 string to_string(int),
而char变量强转int就是ASCII值,再弄进字符串里,就是lz得到的结果,
这个错误会导致Wrong Answer。
2.在使用z(d) .top()和z(d) .pop()的时候未考虑到z(d)为空的情况,会导致 Runtime Error 并返回3221225477.
分析异常返回值可知程序读取了无权访问的东西。
所以需要在使用以上函数前对z和d进行判空
根据这一点去修改就可得出正确结果。

两手空空儿 发表于 2023-1-24 18:44:44

正在学C++,从C到C++,一下感觉体量大了好几倍都不止。。。。。。。。。。知识点太多了。。
页: [1]
查看完整版本: c++中字符转换问题