这章讲了栈和队列,栈的特点是后进先出,队列的特点是先进先出,这些都不是重点,重点是遇到问题要知道用哪种数据结构。
比如数制的转换,(1348)10=(2504)8,它的计算过程是
N N /8 N%8
1348 168 4
168 21 0
21 2 5
2 0 2
可以看出要得到(1348)10的8进制,首先求出的是最后一位的数字4,最后求出的是第一位的数字2
显然我们要把4 0 5 2四个数字先存起来
然后再倒过来输出,即输出2504
怎么存这四个数字呢?
用数组存?当然可以,你只需要多开一个变量p,记录数组当前有多少个数字,顺便把p当成下标用。
处理的时候就要注意细节,比如第一个数的下标是不是0,输出的时候是从后往前输出,还要注意边界。
用栈来存?当然可以,你只需要4 0 5 2依次压入栈,算完后全部出栈就可以了。
但是用栈来存的话,相当于划分了层次,同一时间思考的层次不同,再举个栗子
拿括号匹配的题目来说()【】 {}
遇到左括号,用数组做的话:
if(遇到左括号){
p++;
左括号放入数组;
}
用栈做的话:
if(遇到左括号){
左括号入栈;
}
看出直接用数组来做多了一步下标的移动,实际上使用栈也存在下标的移动(如果用顺序栈),只不过在main函数中不需要考虑,
在写栈函数的时候才需要考虑这个问题(STL真好用)
这就相当于划分了层次
就遇到左括号这一步来说
直接用数组做,你要考虑下标,还要考虑存放问题
用栈做,你只需要考虑入栈
使用栈来解决这个问题,在同一时刻可以减少关注的东西,敲代码的时候就可以减少错误
这就相当于 c++ ——> 数据结构 的飞越
栈的引入简化了程序设计的问题,划分了不同的关注层次,使思考范围缩小了。(划重点)
作业的编程题就是括号匹配问题,注意敲代码最好先把思路写下来就行了,因为敲代码时注意了细节,但有可能忽略了全局。
上次博客的目标达到了(a完T1的题)
可惜的是天梯赛1-8没有a出来,我想了下原因主要是我对数据的存储和一些函数不是很了解
(画横线的是我的输入)
在打敲笨钟那题时,交代码后提示我格式错误,当时一脸懵逼。
后来仔细一看,原来是多了换行。
cin.getline(a,1003,'.');中,遇到‘.’停止读入,并把'.'变成了'\n',对于计算机来说,我这里进行了三次输入,计算机看到的是
qiao ben zhong.[空格]qiao ben zhong.[空格]qiao ben zhong.[空格]
处理后就是qiao ben zhong\nqiao ben zhong\nqiao ben zhong\n
三次a的内容分别是:1.qiao ben zhong
2.\nqiao ben zhong
3.\nqiao ben zhong
所以才会出现上面那种输出(上面分析只是我根据输出进行的猜测,希望有大佬分享一下经验)
把‘\n’吸掉就没事了(当时没想到......)
接下来的目标是:把线段树专题打完,好好做一个组员