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