持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
栈
1 栈的特点:
栈:后进先出,只能在栈顶操作。是先移动“指针”还是先移动数据,在出栈和进栈时要保持一致。当进栈操作时,先将数据存入,“指针”再做加一操作;当出栈时,先将数据取出,“指针”再做减一操作。在写代码过程中,我为了方便直接,在出栈时直接depth--,但是在调试时发现了问题。因为数组是从0开始的,取出的数据并不是自己想要的。
//出栈
tempPopChar = data[depth--];
/**
* Push an element.
* @param paraChar
* @return
*/
public boolean push (char paraChar) {
if (depth == MAX_DEPTH) {
System.out.println("Stack is full!");
return false;
}
data[depth++] = paraChar;
return true;
}
/**
* Pop an element
* @return
*/
public char pop() {
char tempPopChar;
if (depth == 0) {
System.out.println("Stack is empty");
return '\0';
}
// error code : tempPopChar = data[depth--];
tempPopChar = data[depth - 1];
depth--;
return tempPopChar;
}
栈的应用(括号匹配)
思路
如(),[],{}括号左右对称,我们将括号分为左右,左括号入栈,遇到右括号就出栈一个左括号与之匹配,匹配成功即匹配,失败则不匹配。不要忘记在最后要判断一下栈中括号是否出栈完。在这里使用的是switch...case来进行判断分支,但是若换成if,else if,else来实现,则代码中会出现很多的分支,显然会显得代码很冗余,所以当分支较多时,使用switch相比if会好一些。
Is the expression [2 + (1 - 3)] * 4 bracket matching? true
Is the expression ( ) ) bracket matching? false
Is the expression (()()(()) bracket matching? false
Is the expression ({}[]) bracket matching? true
Is the expression )( bracket matching? false
递归
1递归特点
我的理解:自己调用自己的方法,但是不能无限制的调用,在合适的时候一定又要一层层跳出自己方法最后跳出。在使用递归时,不能把问题考虑的太细,不然会陷入这个循环中,既然每个子问题规律一样,只需要知道他们规律,剩下交给计算机处理。
总结 1.程序实现出入栈,根据栈的特点,括号匹配例如栈来实现
2.递归的简单应用