• 9.14 | 学习笔记


    1.波兰表达式这个题目以前总是看到,但是一直觉得数字和运算符的存放好烦,学了栈以后发现其实很简单。

    然而接下来就是悲伤的故事,首先我第一次不小心把存放栈顶两个数字的运算结果的tmp设置成了int,丢失数据精度,

    接下来我改上面的问题时,因为太懒,把计数器也设置成了double,数组下标必须是int这个大概是常识,我个辣鸡以前一直不知道!!!

    贴原题和代码,请各位指正,我觉得输入那里写得好蠢

    #include <bits/stdc++.h>
    using namespace std;
    int cnt;
    double a,b,tmp;
    int jdg(string s)
    {
        if(s=="+"||s=="-"||s=="*"||s=="/")return 0;
        return 1;
    }
    stack <double>stk;
    string s[101];
    int main()
    {
        while(cin>>s[cnt])cnt++;
        for(int i=cnt-1;i>=0;i--)
        {
            if(jdg(s[i]))
            {
                if(s[i].find('.'))stk.push(atof(s[i].c_str()));
                else stk.push(1.0*atoi(s[i].c_str()));
            }
            else
            {
                a=stk.top();stk.pop();
                b=stk.top();stk.pop();
                if(s[i]=="+")tmp=a+b;
                else if(s[i]=="-")tmp=a-b;
                else if(s[i]=="*")tmp=a*b;
                else tmp=a/b;
                stk.push(tmp);
            }
        }
        cout<<fixed<<setprecision(6)<<stk.top()<<endl;
        return 0;
    }

     2.双向栈

    这个题目本身不难,可惜做它之前在学环形队列,所以考虑的有点复杂,其实只要设置一个足够大的数组就不用考虑它满了的情况,至于翻转笨想也知道不可能真的会去翻转,不然肯定超时,设置一个标记用来表示栈顶就好

    问题在于之前的环形队列,做的时候觉得自己想的很完备了,最后报错是run time error,这个错误其实常见的就是数组下标越界和除数为0两种情况......有一句tail=(tail+1)%MAXN,稳妥起见还是应写作tail=(tail+1+MAXN)%MAXN

  • 相关阅读:
    SpringBoot + CXF快速实现SOAP WebService(支持Basic Auth)
    利用iptables做端口转发
    artDialog测试
    jquery的常用ajax操作
    通过委托让缓存操作更优雅
    Jquery取得iframe中元素的几种方法
    jQuery选择器大全
    常用JS汇总
    firefox广告拦截插件
    easyUI删除行的操作
  • 原文地址:https://www.cnblogs.com/MissCold/p/11520786.html
Copyright © 2020-2023  润新知