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

 

posted @ 2019-09-14 23:39  MissCold  阅读(121)  评论(0编辑  收藏  举报